Crond bù lịch trình năm phút


22

Có thể bù một tập lệnh cron được thiết lập để chạy cứ sau 5 phút không?

Tôi có hai tập lệnh, tập lệnh 1 thu thập một số dữ liệu từ một cơ sở dữ liệu và chèn nó vào cơ sở dữ liệu khác, tập lệnh 2 lấy ra dữ liệu này và rất nhiều dữ liệu khác và tạo một số báo cáo đẹp từ nó. Cả hai tập lệnh cần chạy cứ sau 5 phút. Tôi muốn bù tập lệnh 2 trong một phút để nó có thể tạo báo cáo từ dữ liệu mới. Tôi muốn kịch bản một chạy :00, :05, :10, :15 [...]và kịch bản hai chạy :01, :06, :11, :16 [...]mỗi giờ. Các tập lệnh không phụ thuộc vào nhau và tập lệnh 2 phải chạy bất kể tập lệnh có thành công hay không. Nhưng nó sẽ hữu ích nếu các báo cáo có thể có dữ liệu mới nhất hte. Điều này có thể với cron?

Bài đăng;
Tôi đã nghĩ về việc sử dụng cả hai lệnh trong tập lệnh shell để chúng chạy ngay lập tức nhưng điều này không hiệu quả, đôi khi tập lệnh 1 có thể bị treo khi chờ API bên ngoài, v.v. vì vậy có thể mất tới 15 phút để chạy, nhưng tập lệnh 2 phải chạy cứ sau 5 phút, vì vậy thực hiện theo cách này sẽ dừng / trì hoãn việc thực thi tập lệnh 2. Nếu tôi có thể đặt tập lệnh này trong Cron, điều đó có nghĩa là tập lệnh 2 sẽ chạy bất kể tập lệnh 1 đang làm gì

Câu trả lời:


14

Bạn có thể chạy các kịch bản bất cứ khi nào bạn muốn sử dụng cron. Nếu bạn muốn chạy tập lệnh 1 cứ sau 5 phút, bạn có thể bắt đầu như thế này:

*/5 * * * * /path/to/script1

Nhưng đây thực sự chỉ là viết tắt cho:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Nếu bạn muốn chạy tập lệnh 2 một phút sau tập lệnh 1, bạn có thể thực hiện việc này:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Bạn cũng có thể làm điều này:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Và sau đó khi bắt đầu kịch bản 2, hãy ngủ trong một phút:

sleep 60

4
Đặt giấc ngủ vào chính kịch bản là một hack xấu xí khiến việc chạy tập lệnh bằng tay từ dấu nhắc đau đớn. Có một cách ít xấu xí hơn để hack đó là làm cho phần ngủ của mục crontab, nhưng một cách thậm chí thanh lịch hơn là chỉ bù các công việc bằng cách sử dụng ký hiệu crontab chính xác mà câu trả lời của bạn không chạm vào.
Caleb

39

Trường nhập phút cho crontab chấp nhận toán tử "gia số" gây nhầm lẫn bởi vì có vẻ như nó phải là toán tử "chia cho" toán học nhưng không phải. Bạn sẽ thường xuyên thấy nó được sử dụng một cái gì đó như sau. Lưu ý rằng điều này không tìm thấy các số chia hết cho năm mà thay vào đó lấy mỗi mục thứ năm từ một tập hợp:

 */5 * * * * command

Điều này cho biết cron khớp với mọi mục thứ năm ( /5) từ tập phút 0-59 ( *) nhưng bạn có thể thay đổi tập như sau:

 1-59/5 * * * * command

Điều này sẽ lấy mọi mục thứ năm từ bộ 1-59, chạy lệnh của bạn ở phút 6, 11, 16, v.v.

Nếu bạn cần nhiều điểm nhỏ hơn một phút, bạn có thể hack nó bằng lệnh ngủ như một phần của crontab của bạn như thế này:

 */5 * * * * sleep 15 && command

Điều này sẽ chạy công việc của bạn cứ sau năm phút, nhưng lệnh sẽ không thực sự bắt đầu cho đến 15 giây sau phút. Đối với các công việc đang chạy ngắn trong đó vài giây sau khi một thứ khác tạo ra sự khác biệt nhưng bạn không muốn trễ một phút, đây là một cách hack đủ đơn giản.


1
Đây là một câu trả lời tốt hơn so với câu trả lời được chấp nhận. Đặt bù qua phạm vi sẽ sạch hơn nhiều so với ngủ.
ND Geek

11

Bạn có thể chỉ ra thời gian bù với ký hiệu +. Ví dụ, để chạy tại :01, :06, :11, :16 [...], tạo một tác vụ như

*/5+1 * * * * command

7
Điều này dường như không hoạt động trong một số phiên bản của cron
jhoff

1
Phiên bản nào của cron bạn đang sử dụng có hỗ trợ cú pháp này? Cronie dường như không hỗ trợ nó.
Matthew G

Tôi có Cronie trên CentOS7, vì vậy tôi sẽ không thử giải pháp này trước.
AnneTheAgile

1

Điều này làm việc cho tôi:

1/5 * ? * * *

Trong đó 1 là số phút bù. Vì vậy, nếu bạn muốn bù ba phút:

3/5 * ? * * *

Tôi có cái này hoạt động trong cài đặt lịch AWS

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.