Nhiều mục crontab @d Daily có được xử lý theo thứ tự không?


22

Tôi muốn hai công việc chạy đôi khi mỗi ngày, theo cách chính xác, theo thứ tự tôi chỉ định. Crontab này đáng tin cậy sẽ làm những gì tôi muốn?

@daily job1
@daily job2

Tôi giả định họ chạy một sau khi khác, nhưng tôi đã không thể tìm thấy câu trả lời bằng cách tìm kiếm Web hoặc từ bất kỳ các trang man: cron(1), crontab(1), crontab(5).

Crontab ở trên rõ ràng sẽ không làm những gì tôi muốn nếu cron chạy mọi thứ theo lịch trình @dailysong song hoặc theo thứ tự không thể đoán trước.

Tôi biết tôi chỉ đơn giản có thể tạo một tập lệnh shell để loại bỏ chúng theo thứ tự, tôi chỉ tò mò về cách thức hoạt động của cron (và tôi quá lười để thu thập dữ liệu thử nghiệm hoặc đọc mã nguồn).

Cron được cung cấp bởi các crongói. Hệ điều hành là Ubuntu 10.04 LTS (máy chủ).


Bạn có biết crongói nào đang được cung cấp bởi gói không? Hầu như tất cả các trình nền cron mà tôi biết sẽ xử lý việc này theo thứ tự và đồng bộ, trước tiên thường phân tích từng tệp theo thứ tự bảng chữ cái (mặc dù một số làm theo thời gian giữa các lần chạy theo thứ tự tăng dần), và sau đó là các công việc bên trong theo thứ tự.
Chris Xuống

5
Thực tế là nó được quy định dưới mức thường có nghĩa là nó phụ thuộc vào việc thực hiện và tốt nhất là không nên phụ thuộc vào hành vi đó. Có lẽ nó sạch sẽ và được tổ chức tốt hơn để đặt một chuỗi các công việc trong đó trình tự quan trọng trong tập lệnh riêng của nó thay vì các mục crontab riêng biệt.
jw013

@ChrisDown: Vixie Cron, tôi nghĩ vậy. packages.ubuntu.com/lucid/cron
Adam Monsen

1
Tôi đề nghị nếu bạn thực sự muốn chạy chúng theo thứ tự, hãy thực hiện một phút sau.
Kevin

@ jw013 và Kevin: đồng ý, nhưng đó không phải là câu hỏi của tôi.
Adam Monsen

Câu trả lời:


26

Sau khi xem nhanh nguồn (trong nén Debian, mà tôi nghĩ là cùng một phiên bản), nó trông giống như các mục trong một tệp đã cho và cùng thời gian được thực hiện theo thứ tự. Đối với mục đích này, @daily0 0 * * *là giống hệt nhau (trên thực tế @dailylà giống hệt 0 0 * * *trong cron này).

Tôi sẽ không dựa vào điều này trên bảng. Có thể một ngày nào đó sẽ có người quyết định rằng cron nên chạy các công việc song song, để tận dụng các CPU 32 lõi này có 31 lõi chạy không tải. Điều này có thể được thực hiện khi triển khai mục việc cần làm 20 năm này gặp phải trong nguồn cron:

Tất cả những thứ này nên được gắn cờ và giới hạn tải; tức là, thay vì @hourly có nghĩa là "0 * * * *", nó có nghĩa là "gần phía trước mỗi giờ nhưng không phải là cho đến khi tải hệ thống thấp". (Vách) (vix, jan90)

Rất dễ để viết @daily job1; job2ở đây. Nếu điều quan trọng là các công việc thực hiện theo thứ tự, hãy biến nó thành hậu quả trực tiếp của những gì bạn viết.

Ngoài ra, việc đặt hàng rõ ràng sẽ loại bỏ rủi ro rằng quản trị viên tương lai sẽ sắp xếp lại các dòng nghĩ rằng điều đó không quan trọng.


5

http://ss64.com/osx/crontab.html (cũng như các tài liệu tham khảo khác) nói rằng @daily tương đương với

0 0 * * *

Mà nói chạy lúc nửa đêm. Tôi hy vọng hai dòng loại này sẽ được tung ra càng gần nửa đêm càng tốt, không có gì đảm bảo sẽ chạy trước. Tôi đồng ý với đề nghị của jw013 trong bình luận của anh ấy:

Thực tế là nó được quy định dưới mức thường có nghĩa là nó phụ thuộc vào việc thực hiện và tốt nhất là không nên phụ thuộc vào hành vi đó. Có lẽ nó sạch sẽ và được tổ chức tốt hơn để đặt một chuỗi các công việc trong đó trình tự quan trọng trong tập lệnh riêng của nó thay vì các mục crontab riêng biệt.


Điều này giúp, cảm ơn. Tôi đồng ý đề xuất của @ jw013 là hợp lệ, nhưng đó không phải là câu hỏi tôi đã hỏi. Tôi đoán tôi sẽ phải tham khảo nguồn thực tế cho câu trả lời dứt khoát, vì điều này có lẽ, thực sự, cụ thể là thực hiện.
Adam Monsen

0

@Giles nhận xét về việc sử dụng một tập lệnh duy nhất khi nó được nhập để chạy mọi thứ theo thứ tự là phù hợp.

cron.dailytập tin không chỉ định thời gian chạy. Đó là kinh nghiệm của tôi rằng họ chạy ser seri. Điều này có ý nghĩa như nhiều công việc nền có thể chạy trên máy tính xách tay hoặc hệ thống khác

Khi thời gian được chỉ định, tất cả các công việc được lên lịch cho phút hiện tại sẽ được chạy. Đó là một ý tưởng tốt để sử dụng thời gian khác nhau.

Nếu bạn có các công việc loại trừ lẫn nhau, thông thường sử dụng tệp khóa để xác định xem công việc kia có đang chạy hay không.


@dailylà hơi khác so với /etc/cron.daily. Cái trước là một cú pháp thay thế để sử dụng trong crontab. Cũng có một cái nhìn tại run-parts. Hệ thống của tôi sử dụng run-partsđể chạy các chương trình trong /etc/cron.daily. Theo run-parts(8)trang này, "Các tệp được chạy theo thứ tự từ vựng của tên của chúng ...".
Adam Monsen
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.