Công Cụ Này Là Gì?
Biểu thức cron là một chuỗi lịch trình gọn gàng gồm năm trường — `phút giờ ngày-trong-tháng tháng ngày-trong-tuần` — được dùng bởi tiến trình nền `cron` của Unix và hầu như mọi bộ lập lịch tác vụ được xây dựng theo mô hình đó (crontab, Kubernetes CronJobs, `schedule:` của GitHub Actions, Airflow, Jenkins). Mỗi trường chấp nhận dấu sao (`*`, nghĩa là "bất kỳ giá trị nào"), một số cụ thể, danh sách cách nhau bằng dấu phẩy (`1,15,30`), một khoảng (`9-17`), một bước nhảy (`*/15`, nghĩa là "mỗi 15 đơn vị"), hoặc — đối với tháng và ngày trong tuần — tên viết tắt ba chữ cái (`JAN`, `MON`) thay vì số.
Định nghĩa chính thức của cú pháp này nằm trong trang man crontab(5) của Linux, tài liệu này ghi lại đúng năm trường tương tự, các ký tự đặc biệt (`* , - /`), và tám chuỗi viết tắt `@` (`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`) mà hầu hết các bản triển khai cron, kể cả Vixie cron (phiên bản được cài trên hầu hết các bản phân phối Linux), hỗ trợ như bí danh cho các lịch trình phổ biến.
Công cụ này triển khai đúng định dạng chuẩn 5 trường đó — định dạng bạn sẽ nhập trực tiếp vào `crontab -e` trên máy chủ Linux hoặc macOS, hoặc vào trường `schedule:` của Kubernetes CronJob. Nó không triển khai cú pháp Quartz cron, một định dạng khác gồm 6 hoặc 7 trường được dùng bởi Quartz Scheduler của Java và một số công cụ của nhà cung cấp (xem phần so sánh bên dưới để biết khi nào bạn cần dùng nó thay thế).
Tại Sao Nên Dùng?
- Bạn vừa vào team mới và được giao bảo trì cronjob backup database do dev trước để lại, chỉ vỏn vẹn `0 2 */3 * *` không một dòng chú thích — dán chuỗi đó vào đây để có ngay bản dịch dễ hiểu trước khi dám đụng vào.
- Bạn cần tạo workflow GitHub Actions chạy vào giờ hành chính từ thứ Hai đến thứ Sáu để auto-deploy staging, nhưng lúc nào cũng quên thứ tự trường nào là phút, trường nào là giờ — dùng menu thả xuống ở đây thay vì phải mở lại tài liệu crontab.
- Cronjob production của bạn đột nhiên chạy hai lần trong cùng một ngày và bạn nghi ngờ có vấn đề ở cách kết hợp trường ngày-trong-tháng và ngày-trong-tuần — kiểm tra 5 lần chạy tiếp theo ở đây để xác nhận có phải đang dính bẫy ngữ nghĩa OR nổi tiếng giữa hai trường đó không.
- Khách hàng yêu cầu gửi báo cáo hằng tuần tự động "mỗi thứ Hai lúc 8 giờ sáng" và bạn cần một biểu thức cron hợp lệ ngay, không sai lệch vị trí trường — nhập yêu cầu đó vào trình xây dựng và sao chép kết quả thẳng vào crontab server.
- Bạn cấu hình Kubernetes CronJob cho tác vụ dọn dẹp mỗi 15 phút nhưng không chắc `*/15` ở trường giờ có nghĩa là "mỗi 15 giờ" hay đặt sai vị trí — xác minh trước cấu trúc trường ở đây trước khi apply lên cluster production.
- Bạn debug lý do job Airflow không chạy đúng lịch mong đợi, và nghi ngờ vấn đề nằm ở việc nhầm giữa cú pháp Quartz cron và cron chuẩn 5 trường — xem bảng so sánh ở đây để chắc chắn công cụ bạn dùng thực sự phù hợp với loại scheduler đó.
Cách Sử Dụng
- Để dịch một biểu thức: gõ hoặc dán một chuỗi cron 5 trường (hoặc viết tắt @shorthand như `@daily`) vào ô nhập liệu.
- Đọc mô tả bằng ngôn ngữ thường và 5 lần chạy tiếp theo được tính toán bên dưới — cả hai đều cập nhật trực tiếp khi bạn gõ.
- Để xây dựng một biểu thức thay vào đó: mở phần Trình xây dựng, chọn chế độ (mỗi / mỗi N / giá trị cụ thể) cho từng trong năm trường, rồi nhấn "Tạo biểu thức."
- Biểu thức được tạo ra sẽ điền vào ô nhập liệu phía trên và ngay lập tức phản hồi vào bảng mô tả cùng các lần chạy tiếp theo.
- Sử dụng bảng chú giải cú pháp ở dưới cùng như tài liệu tham khảo nhanh cho `*`, `,`, `-`, và `/`.
- Sao chép biểu thức cuối cùng bằng nút Sao chép và dán vào crontab, cấu hình CI, hoặc bộ lập lịch của bạn.
Ví dụ
Đầu vào
*/15 9-17 * * MON-FRIĐầu ra
Vào lúc 09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45, vào thứ Hai, thứ Ba, thứ Tư, thứ Năm, thứ SáuBiểu thức này chạy mỗi 15 phút, nhưng chỉ trong khoảng giờ từ 09:00 đến 17:59, và chỉ vào các ngày trong tuần — một lịch trình thăm dò "giờ hành chính" điển hình.
Cron chuẩn so với Quartz cron
"Cú pháp cron" không phải là một chuẩn phổ quát duy nhất — hai định dạng bạn thường gặp nhất khác nhau về số lượng trường và ý nghĩa của một vài ký tự đặc biệt. Dùng bảng này để xác nhận bạn đang dùng đúng định dạng cho bộ lập lịch đích của mình.
| Khía cạnh | Cron chuẩn (công cụ này) | Quartz cron |
|---|---|---|
| Số lượng trường | 5 (minute hour dom month dow) | 6 hoặc 7 (thêm giây, và năm tùy chọn) |
| Được dùng bởi | crontab của Linux/macOS, Kubernetes CronJob, GitHub Actions | Quartz Scheduler của Java, một số bộ lập lịch doanh nghiệp |
| Cả ngày-trong-tháng và ngày-trong-tuần đều được đặt | Khớp với BẤT KỲ điều kiện nào (hợp/HOẶC) | Yêu cầu `?` ở một trong hai trường — không thể đặt giá trị cho cả hai cùng lúc |
| Ký tự đặc biệt bổ sung | Không có ngoài `* , - /` | Thêm `?`, `L` (cuối cùng), `W` (ngày làm việc gần nhất), `#` (ngày trong tuần thứ n của tháng) |
| Lập lịch cấp độ giây | Không hỗ trợ | Được hỗ trợ (trường đầu tiên) |
Công cụ liên quan
Đang làm việc với cấu hình, lịch trình hoặc dấu thời gian? Những công cụ này rất hợp với trình tạo cron.
→ Chuyển Đổi Dấu Thời Gian · Chuyển Đổi Đồng Hồ Thế Giới · Máy Tính Ngày Tháng
Những lỗi cron thường gặp nhất khiến developer mắc bẫy
- Nhầm tưởng trường ngày-trong-tháng và ngày-trong-tuần hoạt động theo phép AND khi cả hai đều được điền — trong khi cron POSIX chuẩn dùng logic OR, nguồn gốc kinh điển của lỗi khiến job chạy nhiều hơn dự kiến.
- Quên rằng Chủ nhật có thể được biểu diễn bằng cả 0 và 7 tùy vào cách triển khai, dễ gây nhầm lẫn khi đọc cronjob cũ do developer khác viết.
- Cho rằng biểu thức cron tự động điều chỉnh theo múi giờ máy chủ — trong khi cron chạy lịch trình dựa trên giờ hệ thống cục bộ của máy chủ đó, không phải múi giờ nơi bạn viết code.
- Trộn lẫn cú pháp Quartz cron (có trường giây và ký tự `?`/`L`/`W`) với cron chuẩn 5 trường khi sao chép ví dụ từ Stack Overflow mà không kiểm tra trước scheduler thực tế mà dự án đang dùng.
Câu Hỏi Thường Gặp
Biểu thức cron là gì?
Biểu thức cron là một chuỗi văn bản gồm 5 trường (`phút giờ ngày-trong-tháng tháng ngày-trong-tuần`) chỉ định một lịch trình lặp lại cho tiến trình nền `cron` của Unix và các bộ lập lịch tương thích. Mỗi trường có thể là `*` (bất kỳ giá trị nào), một số, danh sách cách nhau bằng dấu phẩy, một khoảng (`a-b`), hoặc một bước nhảy (`*/n`); các trường tháng và ngày trong tuần cũng chấp nhận tên viết tắt ba chữ cái như `JAN` hoặc `MON`. Đặc tả đầy đủ được ghi trong trang man crontab(5).
Điều gì xảy ra khi cả ngày-trong-tháng và ngày-trong-tuần đều bị giới hạn?
Đây là một điểm dễ gây nhầm lẫn nổi tiếng của cron: theo ngữ nghĩa POSIX cron, khi CẢ HAI trường ngày-trong-tháng và ngày-trong-tuần đều bị giới hạn (không phải `*`), tác vụ sẽ chạy nếu BẤT KỲ điều kiện nào được thỏa mãn — đây là phép hợp (HOẶC), không phải phép giao (VÀ). Ví dụ, `0 4 8 * MON` chạy lúc 4 giờ sáng vào cả ngày 8 hàng tháng VÀ vào mỗi thứ Hai, chứ không chỉ vào những thứ Hai rơi vào ngày 8. Công cụ này triển khai đúng hành vi hợp đó khi tính toán các lần chạy tiếp theo.
Cron chuẩn so với Quartz cron — bạn cần loại nào?
Công cụ này tạo ra cú pháp cron POSIX/Vixie chuẩn 5 trường — định dạng được dùng bởi `crontab` của Linux/macOS, Kubernetes CronJobs, `schedule:` của GitHub Actions, và hầu hết các trình chạy tác vụ có nguồn gốc từ Unix. Quartz cron, được dùng bởi Quartz Scheduler của Java và các công cụ xây dựng dựa trên nó (một số bộ lập lịch doanh nghiệp, cấu hình Spring Batch cũ), là một định dạng khác gồm 6 hoặc 7 trường, thêm một trường giây ở đầu và thay đổi ý nghĩa của một số ký tự đặc biệt (`?` nghĩa là "không có giá trị cụ thể" trong các trường ngày, `L`/`W`/`#` nghĩa là "ngày cuối cùng," "ngày làm việc gần nhất," và "ngày trong tuần thứ n của tháng"). Nếu bộ lập lịch của bạn có 6 hoặc 7 trường, hoặc tài liệu của bạn nhắc đến `?`, `L`, `W`, hoặc `#`, bạn cần một công cụ dành riêng cho Quartz — các biểu thức từ trình tạo này sẽ không được phân tích đúng ở đó. Nếu chính xác là 5 trường (hoặc viết tắt kiểu `@daily`), bạn đang ở đúng nơi.
Các lối tắt @yearly, @monthly, @weekly, @daily và @hourly có nghĩa là gì?
Đây là các chuỗi viết tắt không chuẩn nhưng được hỗ trợ rộng rãi, được mở rộng thành các biểu thức 5 trường phổ biến: `@yearly`/`@annually` = `0 0 1 1 *` (một lần mỗi năm, vào lúc nửa đêm ngày 1 tháng 1), `@monthly` = `0 0 1 * *` (ngày 1 hàng tháng lúc nửa đêm), `@weekly` = `0 0 * * 0` (mỗi Chủ nhật lúc nửa đêm), `@daily`/`@midnight` = `0 0 * * *` (mỗi ngày lúc nửa đêm), `@hourly` = `0 * * * *` (đầu mỗi giờ). Công cụ này phân tích tất cả các chuỗi đó và xử lý chúng chính xác như biểu thức 5 trường tương đương đã mở rộng.
Tôi có thể dùng tên ngày/tháng thay vì số không?
Có. Trường tháng chấp nhận tên viết tắt ba chữ cái từ `JAN` đến `DEC`, và trường ngày trong tuần chấp nhận từ `SUN` đến `SAT` (không phân biệt chữ hoa/thường), có thể dùng thay thế cho số. Số ngày trong tuần chạy từ 0–6 với 0 = Chủ nhật; một số bản triển khai cũng chấp nhận 7 cho Chủ nhật, và công cụ này sẽ chuẩn hóa về 0. Các khoảng và danh sách cũng hoạt động với tên, ví dụ `MON-FRI` hoặc `JAN,JUN,DEC`.
Biểu thức cron của tôi có được gửi lên máy chủ không?
Không. Việc phân tích, mô tả bằng ngôn ngữ thường, và tính toán lần chạy tiếp theo đều diễn ra cục bộ bằng JavaScript ngay trong trình duyệt của bạn. Không có gì bạn nhập hoặc tạo ra rời khỏi thiết bị của bạn.
Công cụ này có tính đến múi giờ máy chủ của tôi không?
Không tự động — bản thân cron vốn không lưu thông tin múi giờ trong biểu thức của nó; thời điểm chạy phụ thuộc vào múi giờ hệ thống nơi daemon cron đó đang hoạt động. Công cụ này tính 5 lần chạy tiếp theo dựa trên giờ hiện tại trên thiết bị của bạn, vì vậy nếu server production dùng UTC còn bạn ở múi giờ Việt Nam, hãy tính toán chênh lệch giờ trước khi kết luận về lịch trình thực tế.
Tại sao cronjob của tôi chạy vào ngày không như mong đợi dù trường ngày-trong-tháng và ngày-trong-tuần đã điền đúng?
Rất có thể bạn đang gặp bẫy ngữ nghĩa OR giữa trường ngày-trong-tháng và ngày-trong-tuần — khi cả hai đều được đặt giá trị cụ thể (không phải `*`), cron chạy tác vụ nếu BẤT KỲ điều kiện nào đúng, chứ không phải khi CẢ HAI cùng đúng. Xem lại phần FAQ về tương tác ngày/thứ ở trên và kiểm chứng 5 lần chạy tiếp theo ở đây để xác nhận hành vi thực tế.
Tôi có thể dùng công cụ này để xây dựng lịch trình cho GitHub Actions hoặc GitLab CI không?
Có thể — trường `schedule:` của cả GitHub Actions và GitLab CI đều dùng đúng cú pháp cron POSIX/Vixie chuẩn 5 trường mà công cụ này triển khai, nên biểu thức bạn xây dựng ở đây có thể dán thẳng vào file YAML workflow mà không cần chỉnh sửa gì thêm.
Điều gì xảy ra nếu tôi nhập nhầm số ngoài phạm vi hợp lệ, ví dụ phút 60 hoặc tháng 13?
Cron thực tế sẽ từ chối hoặc xử lý không như mong đợi với các giá trị ngoài phạm vi như vậy, tùy vào cách triển khai — công cụ này giúp ngăn lỗi kiểu đó ngay từ đầu vì trình xây dựng bằng menu thả xuống chỉ hiển thị các lựa chọn giá trị hợp lệ cho từng trường, nên bạn sẽ không bao giờ tạo ra biểu thức có số vượt phạm vi.