Làm thế nào để giữ cron khỏi đóng dấu?


13

Nói rằng tôi có một số tập lệnh cron cần chạy cứ sau 15 phút. Tôi có thể đặt chúng chạy: */15 * * * *nhưng sau đó tất cả chúng chạy cùng một lúc. Có vẻ ngớ ngẩn khi máy chủ ngồi không trong vài phút và sau đó đột nhiên cố gắng thực hiện hàng tá tập lệnh cùng một lúc.

Có cách nào để tôi có thể chạy một tập lệnh vào phút 1, 16, 31, 46 và một tập lệnh khác vào lúc 2, 17, 32, 47 không?

Nói cách khác, tôi muốn mỗi tập lệnh chạy cứ sau 15 phút, nhưng tôi không quan tâm rằng chúng chạy cụ thể vào các giờ của quý.

Câu trả lời:


7

Bạn đang làm điều này khó hơn nó cần phải được. Đặt tất cả chúng trên cùng một dòng, cách nhau bằng dấu chấm phẩy:

*/15 * * * * command1 ; command 2 ; command 3

Nó sẽ chạy command1, đợi cho nó kết thúc, sau đó chạy command2, đợi cho đến khi nó kết thúc, và cứ thế.


15

Nếu bạn thực hiện công việc định kỳ của mình trông như thế này: 6-59/15 * * * *thì nó sẽ chạy vào lúc 6, 21, 36 và 51 phút trước giờ.

Điều này có thể không hoạt động với tất cả các phiên bản của cron.


14

Bạn có thể đặt tất cả các tập lệnh vào một thư mục, /etc/cron.15msau đó chạy cron

*/15 * * * * run-parts /etc/cron.15m

Đó là giả sử bạn có run-partslệnh. Nó hiện diện trên tất cả các hệ thống dựa trên Debian. Nó chạy tất cả các chương trình thực thi trong thư mục được đặt tên, mỗi lần một thứ tự theo danh sách.

Một nhược điểm của phương pháp này là nếu một trong các tập lệnh bị treo, tất cả phần còn lại sẽ chờ và không được thực thi. Nếu thời gian chạy của tất cả chúng là hơn 15 phút, thì công việc sẽ bắt đầu chạy lại và bạn có thể nhận được rất nhiều quy trình chồng chất.


run-partscũng có mặt trong các hệ thống Fedora / Red Hat.
mattdm

9

Cách đơn giản nhất để làm điều này chỉ là thiết lập thủ công các lệnh để chạy khi bạn muốn chúng:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Hoặc bạn có thể viết một tập lệnh để tự động tạo các mục crontab thích hợp (tránh lỗi chính tả).

Một số phiên bản của cron (có thể bao gồm cả phiên bản bạn đang sử dụng) chấp nhận cú pháp mở rộng:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron không thực sự giỏi trong những gì bạn đang cố gắng làm. Bạn đã bao giờ xem việc viết một kịch bản hoạt động như một daemon về cơ bản ngủ 15 phút, thực thi lệnh, sau đó lặp lại?


1
Có một vài vấn đề tiềm ẩn với điều đó. Một là nếu bạn thực hiện sleep 300giữa mỗi lần thực thi lệnh, thì việc thực thi lệnh đó sẽ khiến thời gian trôi đi; nó có thể chạy mỗi 15:10 thay vì cứ sau 15:00. Và nếu quá trình nền bị chết hoặc hệ thống khởi động lại, không giống như vậy crond, nó sẽ không tự động khởi động lại. Có nhiều cách để "tạo nền" cho một quá trình nền, nhưng sau đó bạn thực hiện lại khá nhiều crond.
Keith Thompson

Vâng, tôi đồng ý rằng đó không phải là một giải pháp hoàn hảo (mặc dù bạn luôn có thể làm nền cho nhiệm vụ với &), nhưng bạn sẽ đến đó.
Matt Simmons

1
Thay vào đó, chỉ cần cron chạy một tập lệnh duy nhất thực hiện lần lượt tất cả các lệnh của bạn. Trên thực tế, đó là một nhu cầu phổ biến đến nỗi có một kịch bản tiêu chuẩn được gọi là run-partscác tàu có hầu hết các cài đặt cron để thực hiện điều đó một cách cụ thể. Xem câu trả lời của @ AndrewSchulman.
tylerl

0

Nhiều bản phân phối có /etc/cron.d/cronhourly, trong đó tất cả các tập lệnh trong được chạy hàng giờ. Bạn thậm chí có thể chỉ định thứ tự bằng cách bắt đầu chúng với các số liên tiếp, chẳng hạn như 01scriptA 02scriptB - nó sẽ không quan trọng bằng kiến ​​thức định kỳ mà bạn đã có để tạo ra "cronhourlybyfour" khi chúng ta gọi nó trên cơ sở distro linux của Smoothwall :)

Lời cảnh báo: điều này sử dụng các phần chạy như được đề xuất trước đó và các phần chạy KHÔNG thích các tập lệnh với a. trong tên, vì vậy đừng gọi nó là "deletehome Folders.sh" gọi nó là "01deletehome Folders" và đảm bảo bạn bắt đầu với # đúng! dòng cho bất cứ điều gì bạn có ý định để giải thích kịch bản của bạn.

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.