Phân tích & tạo biểu thức cron
Đọc biểu thức cron của Unix, Spring, Quartz và AWS, xem các lần chạy tiếp theo ở bất kỳ múi giờ nào hoặc tạo biểu thức theo từng trường.
Lịch chạy
Phân tích từng trường
| Trường | Biểu thức | Giá trị |
|---|
Các lần chạy tiếp theo
Trình tạo trực quan
Chọn cách lặp lại cho từng trường. “Giá trị cụ thể” nhận danh sách như 1,15 hoặc MON,WED; “Khoảng” nhận từ-đến như 9-17; “Mỗi N” nhận bước nhảy.
Ký tự đặc biệt
| * | Mọi giá trị của trường. |
| , | Danh sách giá trị, ví dụ 1,15,30. |
| - | Khoảng, ví dụ 9-17 hoặc MON-FRI. |
| / | Bước nhảy, ví dụ */15 = mỗi 15; 5/15 = từ 5, mỗi 15 (không có trong cron Unix). |
| ? | Không chỉ định. Quartz và AWS yêu cầu ở trường ngày trong tháng hoặc ngày trong tuần. |
| L | Cuối: L ở ngày trong tháng = ngày cuối; L-3 = ba ngày trước đó; 5L ở ngày trong tuần = Thứ Năm cuối cùng (cách đánh số của Quartz). |
| W | Ngày làm việc gần nhất: 15W = ngày làm việc gần ngày 15 nhất; LW = ngày làm việc cuối cùng của tháng. |
| # | Thứ trong tuần lần thứ N của tháng: 6#3 = Thứ Sáu thứ ba trong Quartz/AWS (1 = Chủ Nhật); 5#3 trong Spring (0 = Chủ Nhật). |
| @daily … | Macro: @yearly, @monthly, @weekly, @daily, @hourly; @reboot chạy một lần khi khởi động. |
Cách sử dụng
- Nhập hoặc dán lịch chạy vào "Biểu thức cron", hoặc nhấp một trong các ví dụ có sẵn; thao tác này cũng đặt "Định dạng" về "Tự nhận diện". Phần tóm tắt và các lần chạy được cập nhật ngay khi bạn gõ.
- Giữ "Định dạng" ở "Tự nhận diện" hoặc chọn hệ thống mà biểu thức được viết cho. Tự nhận diện coi 5 trường là Unix và 7 trường là Quartz. Với 6 trường, công cụ chọn AWS hoặc Quartz dựa vào vị trí của "?", chọn AWS khi trường cuối chứa một năm từ 1970 đến 2199, và trong các trường hợp còn lại thì coi là Spring. Các macro như @weekly được đọc theo Unix. Khi biểu thức hợp lệ, dòng trạng thái cho biết định dạng đã dùng.
- Đọc "Lịch chạy" và "Phân tích từng trường" để biết mỗi trường khớp với những giá trị nào, rồi kiểm tra các ngày trong "Các lần chạy tiếp theo". "Múi giờ" ban đầu là múi giờ của trình duyệt; hãy chọn múi giờ khác nếu cần, và chọn 5, 10 hoặc 20 trong "Số lần chạy hiển thị". Với các múi giờ khác UTC, mỗi lần chạy cũng hiển thị kèm giờ UTC.
- Nếu muốn tự tạo biểu thức, hãy mở "Trình tạo trực quan", chọn định dạng và chọn cách lặp lại cho từng trường, nhập giá trị ở những trường yêu cầu. "Dùng biểu thức này" sao chép "Biểu thức được tạo" vào "Biểu thức cron", đặt "Định dạng" theo định dạng của trình tạo và phân tích biểu thức, để bạn kiểm tra các lần chạy.
Câu hỏi thường gặp
Biểu thức tôi nhập có được gửi đi đâu không?
Không. Biểu thức được phân tích và các lần chạy được tính bằng JavaScript trên trình duyệt của bạn; biểu thức không được tải lên LeedyBox.
Vì sao 0 0 13 * 5 chạy vào mọi Thứ Sáu chứ không chỉ vào Thứ Sáu ngày 13?
Trong cron của Unix, khi cả trường ngày trong tháng lẫn ngày trong tuần đều bị giới hạn (không trường nào bắt đầu bằng *), một ngày được coi là khớp nếu một trong hai trường khớp, nên biểu thức này chạy vào ngày 13 hằng tháng và vào mọi Thứ Sáu. Công cụ áp dụng quy tắc này cho biểu thức Unix, và khi đó "Lịch chạy" ghi "chỉ cần một trong hai". Với biểu thức Spring, công cụ yêu cầu cả hai trường cùng khớp, còn Quartz và AWS tránh vấn đề này bằng cách yêu cầu "?" ở một trong hai trường. Trong cron của Unix, cách xử lý thường gặp là đặt lịch chạy vào mọi Thứ Sáu và kiểm tra ngày bên trong tác vụ.
Chủ Nhật là 0, 1 hay 7?
Tùy định dạng. Trong biểu thức Unix và Spring, 0 và 7 đều là Chủ Nhật và 1 là Thứ Hai; trong Quartz và AWS, 1 là Chủ Nhật và 7 là Thứ Bảy, nên ở đó 1-5 nghĩa là từ Chủ Nhật đến Thứ Năm. Dùng tên ngày như MON-FRI giúp tránh khác biệt này trong Spring, Quartz và AWS.
Vì sao dòng crontab hoặc biểu thức cron( ) của AWS bị từ chối?
Chỉ nhập các trường lịch chạy. Lệnh ở cuối dòng crontab, và tên người dùng trong /etc/crontab, bị tính là các trường thừa, nên công cụ báo trường không hợp lệ hoặc sai số lượng trường. Với AWS, hãy dán sáu trường bên trong cron( ) mà không kèm phần bao bên ngoài.
Làm sao viết lại biểu thức Unix cho Spring, Quartz hoặc AWS?
Spring thêm một trường giây ở đầu, nên 0 9 * * 1-5 thành 0 0 9 * * 1-5. Quartz còn cần "?" ở một trong hai trường ngày và đánh số Chủ Nhật là 1, nên cùng lịch đó là 0 0 9 ? * MON-FRI. AWS không có trường giây, cũng cần "?" ở một trong hai trường ngày như Quartz, và thêm trường năm ở cuối: 0 9 ? * MON-FRI *. Nếu biểu thức Unix giới hạn cả hai trường ngày, nó dựa vào quy tắc chỉ cần một trong hai trường khớp đã nói ở trên, mà các định dạng này không dùng, nên thường bạn cần hai lịch chạy. Hãy kiểm tra kết quả với định dạng đích được chọn và so sánh các lần chạy tiếp theo.
Vì sao công cụ báo không tìm thấy lần chạy nào?
Biểu thức hợp lệ, nhưng không có thời điểm nào khớp trong khoảng 8 năm tới, là phạm vi mà công cụ tìm kiếm. Nguyên nhân thường gặp là ngày không tồn tại, như 0 0 30 2 * (ngày 30 tháng 2) hoặc ngày 31 chỉ đi kèm các tháng có 30 ngày, và trường năm nằm trong quá khứ. Một năm cách hiện tại hơn 8 năm cũng cho cùng thông báo, dù lịch đó vẫn có thể chạy về sau. Một số trình lập lịch, kể cả cron Unix cổ điển, chấp nhận ngày không tồn tại mà không cảnh báo, và tác vụ sẽ không chạy.
Múi giờ nào được dùng, và giờ mùa hè thì sao?
Các lần chạy được tính theo múi giờ chọn trong "Múi giờ". Hãy chọn múi giờ mà trình lập lịch của bạn sử dụng: crontab thường theo múi giờ của máy chủ, các quy tắc lập lịch trong AWS EventBridge dùng UTC, còn EventBridge Scheduler cho phép bạn đặt múi giờ. Menu có múi giờ của trình duyệt, UTC và một số múi giờ phổ biến; nếu múi giờ của trình lập lịch không có trong đó, hãy chọn một múi giờ có cùng độ lệch so với UTC và cùng ngày chuyển giờ mùa hè. Lần chạy rơi vào thời điểm bị bỏ qua khi đồng hồ được chỉnh tiến sẽ không có trong danh sách, còn thời điểm xuất hiện hai lần khi đồng hồ được chỉnh lùi chỉ được liệt kê một lần. Các dịch vụ cron xử lý những giờ này theo những cách khác nhau; ví dụ, cronie có thể chạy tác vụ của giờ bị bỏ qua ngay sau khi chuyển giờ. Hãy kiểm tra cách trình lập lịch của bạn hoạt động, hoặc dùng UTC, vốn không có giờ mùa hè.