Làm thế nào chính xác là một cron daemon?


22

Là lịch trình công việc cron thực sự chính xác?

Ý tôi là, tôi cần một kịch bản để chạy mỗi đêm mới nhất có thể, NHƯNG trước 00:00 ngày hôm sau.

Tôi lý tưởng nhất là chạy một công việc định kỳ vào 23,59 (hoặc 11:59 tối), nhưng hệ thống có thực sự chính xác không? Vì một giây không thành vấn đề, tôi có nên đặt công việc định kỳ thành 23:58 để rời khỏi nó một thời gian không?


13
Tại sao bạn có những yêu cầu này? Tôi có cảm giác sẽ có một cách tốt hơn để làm bất cứ điều gì bạn thực sự cố gắng làm, và bạn cũng có thể hỏi về điều đó. (Sẽ mất nhiều công sức hơn so với việc lên lịch cho một công việc định kỳ, nhưng có lẽ không nhiều hơn thế.)
David Z

Tôi đã từng sử dụng một cron cumb cũ với độ chính xác là 10 phút.
joshudson

7
Yêu cầu của bạn có vẻ không đáng tin cậy đối với tôi. Bạn sẽ làm gì nếu hệ thống của bạn có tải cao vào khoảng nửa đêm. Trừ khi bạn có một hệ thống RT, bạn không thể đảm bảo bất cứ điều gì.
Thomas Erker

Hãy xem xét rằng ngay cả khi bạn quản lý để mua một máy chủ luôn có sẵn và luôn có thể hoàn thành công việc của bạn trong một giây, vẫn có những điều có thể sai. Ví dụ, đồng hồ của bạn có thể bắt đầu trôi mà không nhận ra. Điều này thực sự, thực sự mong manh và tôi đồng ý với các ý kiến ​​trên mà hệ thống cần phải thay đổi.
Chris Hayes

Câu trả lời:


24

Điều mà cron có thể đảm bảo là công việc của bạn sẽ bắt đầu không sớm hơn thời gian quy định (tùy theo độ chính xác của đồng hồ hệ thống). Nhưng không có cách nào để cung cấp cho bạn bất kỳ đảm bảo về thời gian chấm dứt của công việc. Nó sẽ phụ thuộc vào rất nhiều yếu tố:

  • Hệ thống được tải như thế nào
  • Công việc làm gì
  • Chậm do vấn đề phần cứng
  • Chậm do vấn đề mạng (giả sử công việc phụ thuộc vào mạng)

Đề nghị của tôi là thay đổi thiết kế của bạn sao cho thời gian hoàn thành cụ thể không phải là một yêu cầu.


1
Cách dễ nhất để làm điều này có lẽ là bắt đầu công việc thông qua cron tạo một tệp để cho biết nó đang chạy bị xóa bất cứ khi nào công việc thoát ra (thành công hoặc không thành công), và sau đó là công việc tiếp theo (giả sử đó là mục đích) chờ cho đến khi tập tin biến mất trước khi nó làm bất cứ điều gì.
CVn

@ MichaelKjorling Bạn nên sử dụng một thư mục, thay vì một tệp, vì kiểm tra một tệp và sau đó tạo nó không phải là nguyên tử .
8

1
@ 8bittree bạn cũng có thể sử dụng đàn nếu có.
user9517 hỗ trợ GoFundMonica

1
@ MichaelKjorling Nhưng tại sao phải bận tâm với trường hợp có thể ổn khi trường hợp đúng cũng đơn giản hơn?
8

4
@ 8bittree Nếu bạn sử dụng O_CREATvà gắn O_EXCLcờ, nó sẽ là nguyên tử miễn là tệp nằm trên hệ thống tệp cục bộ.
kasperd

14

Tôi cho rằng điều này phụ thuộc vào trình nền cron của bạn, nhưng tài liệu và tiêu chuẩn chỉ ra rằng nếu bạn chỉ định phút, công việc sẽ thực hiện vào phút đã chỉ định.

Xem:

Xin lưu ý rằng tập lệnh của bạn sẽ được bắt đầu khi đồng hồ điểm đúng giờ, nhưng sẽ kết thúc sau đó.


Tôi có một máy chủ ảo với tải rất thấp và một cron được thiết lập để chạy mỗi phút đôi khi sẽ bắt đầu ở 0, 1, 2, đôi khi lên đến 17 giây. Tôi đoán là cron có thể kém chính xác hơn trên một máy chủ ảo, vì quá trình khác bên ngoài máy chủ đó có thể ảnh hưởng đến sự sẵn có của các tài nguyên như CPU.
Liam

8

Thông thường, cron sẽ bắt đầu lúc 23:59:00 , quét tất cả các tệp crontab của bạn, lọc ra những người có liên quan đến 23:59 và sau đó khởi động chúng. Quét các tệp này rất nhanh, vì không có nhiều trong số chúng và tất cả chúng chỉ bao gồm một vài dòng. Vì vậy, thông thường, các cronjobs bắt đầu lúc 23:59:00 hoặc 23:59:01 Có những cách chắc chắn để cố tình làm chậm quá trình này. (ví dụ, thêm hàng triệu dòng vào crontab). Nếu hệ thống hoàn toàn quá tải, điều này cũng sẽ không hoạt động nhanh như vậy.

Ngoài ra, điều này rõ ràng là phụ thuộc thực hiện.

Nếu bạn cần thời gian bắt đầu rất chính xác, tốt hơn hết là bạn nên tạo một chương trình ngủ cho đến khi bạn muốn và sau đó chạy (ví dụ: sử dụng c ++ 11 ). Nhưng trên hệ điều hành không theo thời gian thực, điều này cũng sẽ không chính xác! Đồng hồ của PC cũng không biết thời gian chính xác!

Trong mọi trường hợp, điều này chỉ đảm bảo chương trình bắt đầu vào (nhiều hơn hoặc ít hơn) thời gian bạn muốn. Không thể có bất kỳ đảm bảo nào rằng chương trình kết thúc thành công cho đến một thời điểm nhất định, vì vậy tôi tin tưởng mạnh mẽ rằng bạn nên thay đổi điều gì đó theo yêu cầu đó.


2
Tôi tin rằng các crontab được giữ trong bộ nhớ - nếu bạn chỉnh sửa trực tiếp các tệp phía sau crontab (thay vì crontab -e, thông báo cho cron khi hoàn thành), các thay đổi sẽ không có hiệu lực. Cron có vô số thời gian chết để tìm ra những công việc sắp tới, nó có thể "ngủ" cho đến khi chính xác công việc thứ hai là do chạy.
AMADANON Inc.

0

Nó phụ thuộc vào thời gian thực hiện tập lệnh tổng thể của bạn và độ chính xác của thời gian máy chủ.

59 23 * * * /some/script/file.sh

sẽ khởi chạy tập lệnh của bạn chính xác vào lúc 23:59, nhưng, nếu bạn có một số lệnh hoạt động trong thời gian dài, một phần của tập lệnh có thể được thực thi sau nửa đêm.


chính xác là vào 23:59 , vậy có thể là từ 23:59:00 đến 23:59:59?
AL

2
Bạn không có giây trong cron bình thường. Để có thêm 59 giây đó, bạn phải thêm 'chờ (59)' ở đầu mã của mình.
Mèo của Henry

4
@AL trong thực tế, tôi luôn thấy nó chạy ở xx: xx: 00 hoặc xx: xx: 01, nhưng trên một hệ thống tải nặng thì không có và không thể hứa hẹn.
hobbs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.