Chạy nhiều công việc định kỳ trong đó một công việc mất nhiều thời gian


16

Tôi có câu hỏi chung sau đây liên quan đến công việc định kỳ.

Giả sử tôi có những điều sau đây crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

Có đủ thông minh để chạy các công việc còn lại vào thời điểm thích hợp? Ví dụ, tập lệnh dài không cần chấm dứt?

Ngoài ra, điều gì xảy ra nếu tập lệnh dài ban đầu vẫn đang chạy và nó được gọi lại bởi cron?

Cảm ơn bạn!


Cron không quan tâm các công việc chạy trong bao lâu; nó sẽ chạy các bản sao bổ sung.
Jeff Schaller

Hãy đảm bảo câu hỏi của bạn được định dạng đúng.
Bram

Câu trả lời:


31

Mỗi công việc định kỳ được thực hiện độc lập với bất kỳ công việc nào khác mà bạn có thể đã chỉ định. Điều này có nghĩa là tập lệnh tồn tại lâu của bạn sẽ không cản trở các công việc khác được thực thi tại thời điểm được chỉ định.

Nếu bất kỳ tập lệnh nào của bạn vẫn đang thực thi ở khoảng thời gian định kỳ tiếp theo của chúng, thì một tập lệnh khác, đồng thời, của tập lệnh của bạn sẽ được thực thi.

Điều này có thể có những hậu quả không lường trước tùy thuộc vào những gì kịch bản của bạn làm. Tôi khuyên bạn nên đọc bài viết Wikipedia về Khóa tệp , cụ thể là phần về Khóa tệp . Tệp khóa là một cơ chế đơn giản để báo hiệu rằng tài nguyên - trong trường hợp của bạn là someScript3.shtập lệnh - hiện đang bị 'khóa' (nghĩa là đang sử dụng) và không được thực hiện lại cho đến khi tệp khóa bị xóa.

Hãy xem các câu trả lời cho câu hỏi sau để biết chi tiết về các cách thực hiện tệp khóa trong tập lệnh của bạn:


8

Không chắc chắn những gì bạn có nghĩa là thời gian thích hợp. Cron sẽ bắt đầu công việc tại thời điểm nó lên kế hoạch để làm như vậy. Nó không kiểm tra các công việc được lên lịch khác cũng như các trường hợp khác của công việc.

Vì vậy, bất kỳ công việc hợp lệ bạn xác định sẽ được bắt đầu tại thời điểm xác định. Bất kỳ công việc nào chạy dài hơn khoảng thời gian xác định sẽ được bắt đầu nhiều lần. Trách nhiệm của bất cứ ai đã viết công việc là ngăn chặn nó thực sự chạy nhiều lần nếu điều đó là bắt buộc. Bằng cách kiểm tra một tập tin khóa hoặc tập tin PID hoặc một cái gì đó.

Có những hạn chế rõ ràng đối với số lượng các quy trình có thể chạy song song nhưng những quy trình này không cụ thể.


6

Ngoài các câu trả lời khác, đặc biệt là liên kết được đăng bởi @souldding: Nếu bạn lên lịch một lệnh chạy dài với khoảng thời gian quá ngắn, cron sẽ vui vẻ thực hiện lệnh thứ hai trước khi lệnh đầu tiên hoàn thành (trừ khi có một loại mutex nào đó được thực hiện trong lệnh) .

Điều đó thường làm chậm lệnh gốc hơn nữa, dẫn đến một trường hợp khác được chạy trước khi các lệnh trước hoàn thành, v.v. Hoặc nó có thể không mong muốn vì những lý do khác.

Cách chung để ngăn chặn là điều kiện chạy lệnh với một người bảo vệ để đảm bảo rằng lệnh trước đó không chạy. Ví dụ:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Đảm bảo rằng pgrep khớp với tên của lệnh khi nó chạy, ví dụ tập lệnh python có python là tên của tệp thực thi, có lẽ không đủ cụ thể và bạn cũng sẽ phải khớp với tên tập lệnh của python.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep không có tùy chọn '-f' khớp với tên tập lệnh bash)

Nếu bạn không thể sử dụng pgrep vì một số lý do:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Dấu ngoặc được sử dụng để tránh khớp lệnh grep.


0

Tôi sử dụng flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
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.