2013-01-25 43 views
12

Sẵn sàng chạy tập lệnh sau 45 phút (không phải là: phút thứ 45 của mỗi giờ)Biểu thức cron sau có nghĩa là cứ 45 phút một lần?

ví dụ: 10:00, 10:45, 11:30, 12:15, v.v.

*/45 * * * * 

Không chắc chắn đây là cụm từ đúng.

+1

Tôi sẽ nói là vậy. cách khác là để chia một ngày trong chu kỳ 45minute và cron mỗi khi bạn nhận được với tính toán đó. – Gjordis

+1

Tôi sẽ nói là không. Tôi tin rằng các trường crontab riêng biệt là riêng biệt, vì vậy '*/45' cho phút có thể giống như' 0,45' –

+0

Thử nghiệm nó với */1 * * * * touch/home/user/testfile hoạt động. Atleast cho Ubuntu 10.04 mặc định crontab – Gjordis

Trả lời

13

tôi nghi ngờ (chỉnh sửa: Tôi khá chắc chắn bởi bây giờ) mà nó không làm những gì bạn muốn: lĩnh vực riêng biệt, và */45 phút là không có gì hơn 0,45. Tôi sẽ sử dụng ba mục sau nếu */45 không thực hiện công việc:

0,45 0-23/3 * * * 
30 1-23/3 * * * 
15 2-23/3 * * * 

Nếu bạn có một cái nhìn tại entry.c tập tin trong nguồn vixie cron, bạn sẽ nhận thấy rằng mỗi lĩnh vực của mỗi mục được phân tách bởi get_list và được biểu thị dưới dạng bitmap các giá trị được phép cho trường đó. Điều đó gần như ngăn cản bất kỳ giải thích "thông minh" nào, vì sự phân biệt của */450,45 bị mất ở giai đoạn này ... nhưng có một cờ MIN_STAR, được đặt ở trạng thái * tính bằng phút (bao gồm */45). Vì vậy, chúng ta hãy xem cron.c, một nơi duy nhất mà MIN_STAR được kiểm tra, để tìm hiểu nó không liên quan đến vấn đề của chúng tôi. Bây giờ chúng tôi biết chắc chắn rằng */45 có nghĩa là "mỗi phút thứ 45 của mỗi giờ": 0:00, 0:45, 1:00, 1:45 và cứ tiếp tục như vậy.

Có hai câu trả lời ở đây tự tin tuyên bố ngược lại, trích dẫn một đoạn văn bất hạnh trong cuốn hướng dẫn:

bước cũng được phép sau dấu hoa thị, vì vậy nếu bạn muốn nói "mỗi hai giờ", chỉ cần sử dụng "*/2"

Chúng tôi may mắn có một ngày 24 giờ, thậm chí có số giờ làm "hai giờ một lần từ 0:00, mỗi ngày" và "mỗi hai giờ nói chung" không thể phân biệt được. Quá tệ khi hướng dẫn không đi đủ xa để ghi lại các trường hợp không tầm thường, tạo ấn tượng rằng * */22 có nghĩa là cứ 22 giờ một lần. Nó không. Gắn dấu sao với một bước chỉ là viết tắt của danh sách giá trị trong trường được sử dụng; nó không tương tác với các trường khác.

+0

Rất thú vị. Bây giờ, tôi tự hỏi, giả sử chỉ có hai lĩnh vực, cụ thể là, phút và giờ, những gì sẽ mô hình sau đây giải quyết? '*/45 */2' Tôi nghĩ rằng hai giờ sẽ được chia thành các khối 45 phút Suy nghĩ của tôi có đúng không? –

+0

@elimence Đã xảy ra lỗi: các trường độc lập. */45 cho phút nghĩa là "xx: 00 hoặc xx: 45", */2 cho giờ có nghĩa là "00: xx", "02: xx" ... "22: xx". Giao lộ cho "00:00, 00:45, 02:00, 02:45" v.v. –

0

Tại thời điểm cơ bản của cron, hệ thống của bạn sẽ kiểm tra một lần mỗi phút để xem có bất kỳ cronjob nào để chạy hay không. Nó sẽ nhìn vào crontab của bạn, và nếu nó là thời gian để chạy, poof, nó chạy! Nhưng mỗi 45 phút là một khoảng thời gian mà sẽ luôn luôn đánh dấu 15 phút trên mặt đồng hồ. ví dụ, bắt đầu từ số không, đầu tiên là 0:45. Tiếp theo sẽ là 90 phút từ số không, hoặc 1:30, tiếp theo sẽ là 2:15 ... dễ dàng như vậy bạn có thể thấy rằng thời gian cho mỗi trường hợp bạn muốn thực thi kịch bản của bạn, phút sẽ là 12, 3, 6, hoặc 9. Nếu bạn thực thi kịch bản của bạn sau mỗi 15 phút, và kiểm tra giờ để xem nó có đúng không, sau đó bạn có thể thực thi kịch bản của mình. Bạn có thể sẽ sử dụng một trong hai bảng, hoặc bạn cũng có thể sử dụng tính năng modulo. Chúc mừng!

Các vấn đề liên quan