Giải mã biểu thức Cron: Lên lịch bất cứ thứ gì
Bạn cần chạy sao lưu cơ sở dữ liệu mỗi đêm lúc 3 giờ sáng. Hoặc gửi báo cáo mỗi sáng thứ Hai. Hoặc xóa cache mỗi 15 phút. Trên server Linux và Unix, công cụ cho việc này là cron, và cách bạn nói cho cron biết khi nào chạy là bằng biểu thức cron.
Biểu thức cron trông đáng sợ khi mới nhìn. 0 3 * * * hoặc */15 9-17 * * 1-5 có thể trông như vô nghĩa nếu bạn không biết mẫu. Nhưng cú pháp đáng ngạc nhiên là đơn giản khi bạn hiểu năm trường.
Năm trường
Mỗi biểu thức cron tiêu chuẩn có đúng năm trường, phân tách bằng dấu cách. Mỗi trường đại diện cho một đơn vị thời gian:
┌───────────── phút (0-59)
│ ┌───────────── giờ (0-23)
│ │ ┌───────────── ngày trong tháng (1-31)
│ │ │ ┌───────────── tháng (1-12)
│ │ │ │ ┌───────────── ngày trong tuần (0-7, trong đó 0 và 7 là Chủ nhật)
│ │ │ │ │
* * * * *
Đó là tất cả. Năm trường, từ trái sang phải: phút, giờ, ngày trong tháng, tháng, ngày trong tuần.
Bạn có biết? Tên "cron" xuất phát từ tiếng Hy Lạp "chronos," nghĩa là thời gian. Daemon cron (tiến trình nền) đã là phần cốt lõi của hệ điều hành giống Unix kể từ năm 1975.
Các ký tự đặc biệt
Dấu hoa thị (*) — Mọi giá trị
Dấu hoa thị nghĩa là "mọi giá trị có thể" cho trường đó.
* * * * * = mỗi phút của mỗi giờ của mỗi ngày.
Dấu phẩy (,) — Nhiều giá trị
Dấu phẩy phân tách các giá trị riêng lẻ.
0 9,12,18 * * * = tại phút 0 của giờ 9, 12 và 18 (9:00 sáng, 12:00 trưa, 6:00 chiều).
Dấu gạch ngang (-) — Phạm vi giá trị
Dấu gạch ngang xác định phạm vi.
0 9-17 * * * = tại phút 0 của mỗi giờ từ 9 đến 17 (9:00 sáng đến 5:00 chiều, mỗi giờ).
Dấu gạch chéo (/) — Giá trị bước
Dấu gạch chéo xác định khoảng cách.
*/15 * * * * = mỗi 15 phút (phút 0, 15, 30, 45 của mỗi giờ).
0 */2 * * * = mỗi 2 giờ tại phút 0 (nửa đêm, 2 giờ sáng, 4 giờ sáng, ...).
Đọc biểu thức Cron: Thực hành
Hãy cùng đọc qua các ví dụ phổ biến. Với mỗi ví dụ, đọc năm trường từ trái sang phải.
0 3 * * * — Hàng ngày lúc 3:00 sáng
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| Phút | 0 | Tại phút 0 |
| Giờ | 3 | Của giờ 3 (3 sáng) |
| Ngày trong tháng | * | Mỗi ngày |
| Tháng | * | Mỗi tháng |
| Ngày trong tuần | * | Mỗi ngày trong tuần |
Diễn giải: "Lúc 3:00 sáng mỗi ngày." Lựa chọn kinh điển cho sao lưu đêm.
*/15 * * * * — Mỗi 15 phút
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| Phút | */15 | Mỗi 15 phút |
| Giờ | * | Mỗi giờ |
| Ngày trong tháng | * | Mỗi ngày |
| Tháng | * | Mỗi tháng |
| Ngày trong tuần | * | Mỗi ngày |
Diễn giải: "Mỗi 15 phút, suốt ngày đêm." Phổ biến cho kiểm tra sức khỏe hệ thống và làm mới cache.
0 9 * * 1-5 — Ngày trong tuần lúc 9:00 sáng
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| Phút | 0 | Tại phút 0 |
| Giờ | 9 | Của giờ 9 |
| Ngày trong tháng | * | Mỗi ngày |
| Tháng | * | Mỗi tháng |
| Ngày trong tuần | 1-5 | Thứ Hai đến Thứ Sáu |
Diễn giải: "Lúc 9:00 sáng, Thứ Hai đến Thứ Sáu." Hoàn hảo cho báo cáo công việc hàng ngày.
0 0 1 * * — Ngày đầu tiên mỗi tháng
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| Phút | 0 | Tại phút 0 |
| Giờ | 0 | Của giờ 0 (nửa đêm) |
| Ngày trong tháng | 1 | Ngày 1 |
| Tháng | * | Mỗi tháng |
| Ngày trong tuần | * | Bất kỳ ngày nào trong tuần |
Diễn giải: "Lúc nửa đêm ngày đầu tiên mỗi tháng." Dùng cho báo cáo tháng, thanh toán hoặc dọn dẹp.
30 8 * * 1 — Thứ Hai lúc 8:30 sáng
| Trường | Giá trị | Ý nghĩa |
|---|---|---|
| Phút | 30 | Tại phút 30 |
| Giờ | 8 | Của giờ 8 |
| Ngày trong tháng | * | Mỗi ngày |
| Tháng | * | Mỗi tháng |
| Ngày trong tuần | 1 | Thứ Hai |
Diễn giải: "Lúc 8:30 sáng mỗi Thứ Hai." Tuyệt vời cho thông báo nhóm hàng tuần.
Viết biểu thức Cron của riêng bạn
Đây là cách tiếp cận có hệ thống:
- Bắt đầu với thời điểm. "Mỗi ngày lúc 3 sáng" hoặc "mỗi 5 phút trong giờ làm việc."
- Điền các trường từ trái sang phải. Bắt đầu với phút, sau đó giờ, rồi ngày trong tháng, rồi tháng, rồi ngày trong tuần.
- Dùng
*cho "mỗi." Nếu bạn không quan tâm đến trường nào, dùng*. - Kiểm tra trước khi triển khai. Luôn xác nhận biểu thức tạo ra lịch trình bạn mong muốn.
Tham khảo nhanh các mẫu phổ biến
| Lịch trình | Biểu thức |
|---|---|
| Mỗi phút | * * * * * |
| Mỗi 5 phút | */5 * * * * |
| Mỗi giờ | 0 * * * * |
| Mỗi ngày lúc nửa đêm | 0 0 * * * |
| Mỗi ngày lúc 3:00 sáng | 0 3 * * * |
| Mỗi Thứ Hai lúc 9:00 sáng | 0 9 * * 1 |
| Ngày trong tuần lúc 8:30 sáng | 30 8 * * 1-5 |
| Đầu mỗi tháng | 0 0 1 * * |
| Mỗi 15 phút, giờ làm việc | */15 9-17 * * 1-5 |
| Hai lần mỗi ngày (9 sáng và 6 chiều) | 0 9,18 * * * |
| Mỗi Chủ nhật lúc 2:00 sáng | 0 2 * * 0 |
Lỗi thường gặp
Quên giờ là 0-23
Giờ 13 là 1:00 chiều, không phải giờ 1. Lỗi phổ biến là viết 0 1 * * * nghĩ rằng nó chạy lúc 1:00 chiều trong khi thực tế chạy lúc 1:00 sáng.
Nhầm lẫn ngày trong tuần
Chủ nhật có thể là 0 hoặc 7 (cả hai đều hợp lệ). Thứ Hai là 1, Thứ Bảy là 6. Một số người mong đợi Thứ Hai là 0.
Tương tác ngày trong tháng và ngày trong tuần
Nếu bạn chỉ định cả ngày trong tháng và ngày trong tuần (không có trường nào là *), hầu hết triển khai cron chạy tác vụ khi bất kỳ điều kiện nào được đáp ứng, không phải khi cả hai đều đáp ứng. Điều này khiến nhiều người bất ngờ.
Cảnh báo Biểu thức 0 9 15 * 1 KHÔNG có nghĩa là "lúc 9 sáng ngày 15, nhưng chỉ nếu là Thứ Hai." Nó có nghĩa là "lúc 9 sáng ngày 15 mỗi tháng VÀ lúc 9 sáng mỗi Thứ Hai." Đây là nguồn phổ biến gây hành vi không mong muốn.
Nhận thức múi giờ
Cron chạy theo múi giờ cục bộ của server. Nếu server ở UTC và bạn ở Việt Nam (UTC+7), tác vụ cron 0 9 * * * chạy lúc 4:00 chiều giờ Việt Nam. Luôn kiểm tra múi giờ server.
Mẹo Kiểm tra và trực quan hóa biểu thức cron trước khi triển khai: Cách đọc và kiểm tra biểu thức Cron. Xem các lần chạy tiếp theo và xác nhận lịch trình khớp với ý định của bạn.
Xây dựng và kiểm tra biểu thức cron:
Miễn phí, tức thì và không cần đăng ký.