03 / HƯỚNG DẪN
Viết biểu thức cron không gây bất ngờ
Năm trường và dải giá trị, tên so với số, bẫy OR giữa ngày trong tháng và ngày trong tuần, Chủ nhật là 0 hay 7, khoảng trống và chồng lấp giờ mùa hè, và kiểm chứng bằng bản xem trước các lần chạy tiếp theo trước khi triển khai.
Năm trường, đọc từ trái sang phải
Biểu thức cron kinh điển gồm năm trường cách nhau bởi khoảng trắng: phút (0–59), giờ (0–23), ngày trong tháng (1–31), tháng (1–12), và ngày trong tuần (0–7). Mỗi trường nhận một giá trị đơn, danh sách phân tách dấu phẩy, dải gạch nối, bước sau dấu gạch chéo, hoặc dấu sao cho mọi giá trị.
Hầu hết bug cron không phải cú pháp kỳ lạ mà là một trường thường bị đọc cẩu thả: bước reset ở biên dải, hoặc trường giờ viết theo đồng hồ mười hai giờ trong hệ thống đếm tới hai mươi ba.
- Danh sáchDanh sách chọn giá trị rời: 0,30 ở trường phút chạy vào đầu giờ và rưỡi.
- Dải và bướcDải chọn một khoảng: 9-17 ở trường giờ phủ giờ làm việc, và bước làm thưa nó — 9-17/2 chạy mỗi hai giờ trong khoảng.
- Dấu sao khớp tất cảDấu sao không phải “bỏ qua trường này”; nó chủ động khớp mọi giá trị, điều trở nên quan trọng ngay khi hai trường ngày tương tác.
Tên là số với tài liệu tốt hơn
Trường tháng và ngày trong tuần nhận tên tiếng Anh ba chữ — JAN tới DEC và SUN tới SAT — làm bí danh cho số. 0 9 * JAN MON và 0 9 * 1 1 mô tả cùng lịch, nhưng bản có tên tự giải thích cho người đọc kế tiếp và chống lỗi lệch một.
- Không phân biệt hoa thườngTên parse không phân biệt hoa thường — mon, Mon và MON đều được — nhưng viết hoa là quy ước trông có chủ đích.
- Tên trong dảiTên cũng dùng trong dải và danh sách: MON-FRI là khoảng ngày làm việc chuẩn, và JAN,APR,JUL,OCT chọn các tháng đầu quý.
- Đọc phần giải thíchCron Builder & Explainer chuẩn hóa biểu thức và giải thích từng trường riêng — "month: every value", "weekday: 1, 2, 3, 4, 5" — để bạn xác nhận bộ parse đọc tên đúng ý bạn.
Hai trường ngày tương tác ra sao
Công cụ dùng quy tắc ngày kiểu Vixie: nếu không trường ngày nào bắt đầu bằng *, chỉ cần một trường khớp. 0 9 13 * FRI nghĩa là ngày 13 hằng tháng và mọi thứ Sáu, không chỉ thứ Sáu ngày 13.
Đầu ra của trình giải thích nói rõ điều này: nó báo ngữ nghĩa là dom-dow-or cạnh các lần chạy đã tính, nên biểu thức sắp chạy thường xuyên hơn ý định sẽ lộ bài trước khi vào crontab.
- Bước có * vẫn giới hạnNếu một trường ngày bắt đầu bằng *, kể cả bước như */2, công cụ yêu cầu cả hai trường ngày đều khớp; giới hạn bước vẫn có hiệu lực.
- Không bắt đầu bằng * thì dùng HOẶCNếu không trường ngày nào bắt đầu bằng *, công cụ áp dụng HOẶC: ngày trong tháng hoặc thứ trong tuần có thể khớp.
- AND cần cách vòngĐể trúng thứ Sáu ngày 13 thật, để cron chọn ngày 13 và cho chính lệnh kiểm tra ngày trong tuần — hoặc dùng trình lập lịch có ngữ nghĩa AND, thứ cron kinh điển không phải.
Chủ nhật là 0, và thường cũng là 7
Trường ngày trong tuần đánh số Chủ nhật là 0, thứ Hai là 1, và cứ thế tới thứ Bảy là 6. Hầu hết hiện thực cũng nhận 7 làm Chủ nhật thứ hai cho người đếm từ thứ Hai — bộ parse Toolars chuẩn hóa 7 thành 0 nội bộ — nhưng một số hệ thống chỉ nhận một trong hai, và kiểu đánh số ISO bắt đầu thứ Hai từ 1 tồn tại ở nơi khác.
- 0 và 70 và 7 đều là Chủ nhật nơi 7 được chấp nhận; viết 0 là lựa chọn khả chuyển giữa các trình lập lịch.
- Lệch một âm thầmNgày trong tuần 7 trên hệ thống từ chối nó thất bại ồn ào lúc triển khai, nhưng ngày trong tuần bị đọc nhầm là “ngày thứ bảy tính từ thứ Hai” thất bại âm thầm vào sai ngày.
- Xác nhận lại theo nền tảngKhi biểu thức di chuyển giữa các hiện thực — crontab hệ thống, nền tảng container, trình lập lịch CI — hãy xác nhận lại đánh số ngày trong tuần thay vì cho rằng nó sống sót qua chuyến đi.
Giờ mùa hè bẻ cong lịch
Đổi giờ mùa hè tạo ra phút địa phương bị thiếu hoặc lặp. Bản xem trước bỏ qua 02:30 không tồn tại vào mùa xuân và liệt kê hai lần phút khớp bị lặp vào mùa thu. Bộ lập lịch thực tế có thể chạy bù hoặc bỏ lượt lặp; hãy xác minh chính sách của nó.
- Giờ mất tíchTrong khoảng giờ thiếu vào mùa xuân, bản xem trước không có phút 02:30 khớp; một số bộ lập lịch chạy bù tác vụ sau khi đổi giờ.
- Giờ nhân đôiTrong khoảng giờ lặp vào mùa thu, bản xem trước có thể liệt kê cả hai thời điểm; bộ lập lịch thật có thể bỏ lần chạy thứ hai.
- UTC không có DSTLối thoát sạch là UTC: nó không có chuyển đổi giờ mùa hè, nên 30 2 * * * nghĩa là cùng thời điểm mỗi ngày trong năm. Trình giải thích cung cấp UTC, múi giờ địa phương của thiết bị, và múi giờ đặt tên như America/New_York và Europe/London.
Kiểm chứng bằng các lần chạy tiếp theo, không phải hy vọng
Khác biệt giữa biểu thức đúng và biểu thức trông có vẻ đúng là danh sách thời điểm chạy cụ thể. Cron Builder & Explainer tính mười lần chạy tiếp theo kể từ bây giờ trong múi giờ bạn chọn, tìm tới 366 ngày về trước, và đánh giá trong worker nền để biểu thức nặng không thể làm tab đứng.
- Đọc các lần chạyĐọc vài lần chạy đầu đối chiếu ý định: “ngày làm việc lúc 09:00” phải hiện thứ Hai tới thứ Sáu lúc chín giờ, và một thứ Bảy trong danh sách chính là bẫy OR đang tự xưng danh.
- Vượt một lần chuyển đổiChọn múi giờ có tên và xem các lần chạy sắp tới nếu lần đổi giờ mùa hè kế tiếp nằm trong cửa sổ 366 ngày. Công cụ tính từ hiện tại; không thể chọn ngày bắt đầu khác.
- Lỗi rõ ràngBiểu thức sai sẽ báo lỗi. Không có lần khớp trong 366 ngày thì báo lỗi giới hạn tìm kiếm; một đến chín lần khớp trả về kết quả một phần.
Lịch và pattern chia sẻ một kỷ luật.
Cả hai đều là chuỗi tí hon với bán kính nổ quá khổ — học vòng viết-test-refactor cho biểu thức chính quy, chạy trong worker cục bộ có timeout.