Bỏ qua đến nội dung
LeedyBox
Ủng hộ

Cách đọc biểu thức cron

Biểu thức cron mô tả một lịch lặp lại bằng vài trường phân tách bằng dấu cách. Ý tưởng thì đơn giản, nhưng thứ tự trường và ký tự đặc biệt khác nhau giữa các hệ thống. Hướng dẫn này cho thấy cách đọc các định dạng phổ biến.

Năm trường của Unix

Cron cổ điển của Unix và Linux dùng năm trường, đọc từ trái sang phải:

phút giờ ngày-trong-tháng tháng ngày-trong-tuần

Vì vậy 30 9 * * 1-5 có nghĩa là "lúc 09:30, từ Thứ Hai đến Thứ Sáu". Phút từ 0 đến 59, giờ từ 0 đến 23, ngày trong tháng từ 1 đến 31 và tháng từ 1 đến 12. Ngày trong tuần từ 0 đến 6, trong đó 0 là Chủ Nhật (nhiều bản triển khai cũng chấp nhận 7 cho Chủ Nhật). Hầu hết các phiên bản còn chấp nhận tên như JAN hoặc MON, và macro như @daily hoặc @hourly.

Định dạng Spring, Quartz và AWS

Các trình lập lịch khác thêm trường, và đây là nguyên nhân gây nhầm lẫn phổ biến nhất khi sao chép biểu thức từ hệ thống này sang hệ thống khác.

Định dạngCác trườngNgày trong tuần
Unix / Linux5: phút giờ ngày tháng thứ0–6, Chủ Nhật = 0
Spring6: giây phút giờ ngày tháng thứ0–7, Chủ Nhật = 0 hoặc 7
Quartz6 hoặc 7: giây phút giờ ngày tháng thứ [năm]1–7, Chủ Nhật = 1
AWS EventBridge6: phút giờ ngày tháng thứ năm1–7, Chủ Nhật = 1

Cùng các chữ số có thể mang nghĩa khác nhau: 0 0 12 * * ? là "mỗi ngày lúc 12 giờ trưa" trong Quartz, nhưng nếu đọc theo dạng 5 trường thì biểu thức này không hợp lệ. Số của ngày trong tuần cũng bị lệch: trong Quartz và AWS, 2 là Thứ Hai, còn trong cron Unix lại là Thứ Ba. Tên ngày như MON giúp tránh sự mơ hồ này ở những nơi được hỗ trợ.

Ký tự đặc biệt

  • * mọi giá trị của trường.
  • , một danh sách, ví dụ 1,15.
  • - một khoảng, ví dụ 9-17 hoặc MON-FRI.
  • / bước nhảy: */15 ở trường phút nghĩa là mỗi 15 phút; 5/15 bắt đầu từ 5 (cron Unix cổ điển không hỗ trợ, ở đó người ta dùng khoảng như 5-59/15).
  • ? "không chỉ định giá trị"; Quartz và AWS yêu cầu ký tự này ở trường ngày trong tháng hoặc ngày trong tuần.
  • L cuối: L ở trường ngày trong tháng là ngày cuối cùng của tháng; trong Quartz, 6L ở trường ngày trong tuần là Thứ Sáu cuối cùng.
  • W ngày làm việc gần nhất: 15W là ngày làm việc gần ngày 15 nhất.
  • # thứ trong tuần lần thứ n của tháng: 6#3 là Thứ Sáu thứ ba theo cách đánh số của Quartz và AWS.

L, W và # là các phần mở rộng mà cron Unix cổ điển không hỗ trợ.

Ngày trong tháng và ngày trong tuần

Khi cả hai trường ngày đều bị giới hạn, các hệ thống không thống nhất cách kết hợp chúng. Trong cron Unix cổ điển, tác vụ chạy khi một trong hai trường khớp: 0 9 13 * 5 chạy vào ngày 13 hằng tháng và vào mọi Thứ Sáu, chứ không chỉ vào Thứ Sáu ngày 13. Spring yêu cầu cả hai đều khớp. Quartz và AWS tránh vấn đề này bằng cách yêu cầu ? ở một trong hai trường.

Công cụ Phân tích cron của LeedyBox áp dụng quy tắc của định dạng bạn chọn và giải thích trong phần tóm tắt là chỉ cần một trong hai ngày hay cả hai ngày phải khớp.

Múi giờ và giờ mùa hè

Biểu thức cron không chứa múi giờ. Nó chạy theo múi giờ của hệ thống hoặc dịch vụ thực thi nó, có thể là giờ địa phương của máy chủ hoặc UTC. Một tác vụ được viết cho 09:00 giờ địa phương có thể chạy vào giờ khác nếu máy chủ dùng UTC.

Giờ mùa hè (DST) còn tạo thêm các trường hợp đặc biệt. Khi đồng hồ được chỉnh tiến lên, một thời điểm như 02:30 có thể không tồn tại trong ngày đó; khi đồng hồ lùi lại, thời điểm đó có thể xảy ra hai lần. Tùy bản triển khai, tác vụ trong khoảng thời gian đó có thể bị bỏ qua, chạy trễ hoặc chạy hai lần. Lên lịch các tác vụ quan trọng ngoài khoảng chuyển giờ, hoặc theo UTC, giúp giảm bất ngờ. Công cụ Phân tích cron cho phép bạn chọn múi giờ và liệt kê các lần chạy tiếp theo để bạn kiểm tra các ngày quanh thời điểm chuyển giờ.

Câu hỏi thường gặp

Làm sao để chạy một tác vụ mỗi 5 phút?

Trong cron Unix, hãy dùng */5 * * * *. Trong Spring, thêm trường giây ở đầu: 0 */5 * * * *.

Vì sao biểu thức Quartz của tôi không chạy được trong crontab của Linux?

Biểu thức Quartz bắt đầu bằng trường giây và có thể dùng ? hoặc L, những thứ mà crontab không chấp nhận. Hãy viết lại biểu thức theo định dạng 5 trường.

Các lần chạy tiếp theo mà công cụ hiển thị có chính xác không?

Chúng được tính trên trình duyệt của bạn theo định dạng và múi giờ đã chọn. Hãy xác nhận lịch trên hệ thống sẽ chạy tác vụ, vì các bản triển khai có thể khác nhau.