Crontab Guru

Dán một biểu thức cron và nhận lời giải thích từng trường, bằng tiếng Anh đơn giản, về điều nó làm. Không cần nhớ thứ tự các trường hay tra cứu phạm vi: Guru lần lượt xem xét cả năm trường (phút, giờ, ngày trong tháng, tháng và thứ trong tuần) và đọc biểu thức từ trái sang phải. Hữu ích để kiểm tra một dòng crontab trước khi triển khai hoặc giải thích một dòng bạn tiếp quản.

Cách sử dụng Guru

  1. 1

    Dán biểu thức

    Sao chép bất kỳ biểu thức cron chuẩn 5 trường nào (ví dụ `0 9 * * 1-5`) vào ô nhập.

  2. 2

    Yêu cầu giải thích

    Nhấp Explain Cron và công cụ trả về mô tả từng dòng cho mỗi trường: phút, giờ, ngày trong tháng, tháng và thứ trong tuần.

  3. 3

    Đọc phần giải thích

    Lời giải thích được tạo bằng tiếng Anh, ví dụ "Minute: every 5 minutes" hoặc "Hour: from 9 through 17."

  4. 4

    Kiểm tra trước khi triển khai

    Dùng lời giải thích để xác nhận lịch chạy đúng như bạn muốn trước khi đưa vào crontab, cấu hình CI hoặc manifest Kubernetes.

Bảng tra cứu nhanh các trường

 ┌───────────── phút (0-59)
 │ ┌─────────── giờ (0-23)
 │ │ ┌───────── ngày trong tháng (1-31)
 │ │ │ ┌─────── tháng (1-12 hoặc JAN-DEC)
 │ │ │ │ ┌───── thứ trong tuần (0-6 hoặc SUN-SAT; Chủ nhật = 0 hoặc 7)
 │ │ │ │ │
 * * * * *

Các toán tử trong biểu thức cron

Toán tử Ý nghĩa Ví dụ
* Mọi giá trị * * * * *
, Danh sách giá trị 0,15,30,45
- Phạm vi 9-17
/ Bước (giá trị đầu/bước nhảy) */5, 0-30/5
L Cuối cùng (ngày cuối của tháng hoặc thứ trong tuần khớp cuối cùng, Quartz) L, 5L
W Ngày làm việc gần nhất 15W (Quartz)
# Thứ trong tuần khớp lần thứ N của tháng 1#3 (Quartz)
? Không có giá trị cụ thể Chỉ Quartz

Thứ tự đọc rất quan trọng

0 */2 * * 1-5 được đọc từ trái sang phải như sau: phút 0, mỗi 2 giờ, ngày nào trong tháng cũng được, tháng nào cũng được, từ thứ Hai đến thứ Sáu. Do thói quen, người ta đôi khi đọc các trường từ phải sang trái và bị rối; hãy luôn bắt đầu từ phút.

Cái bẫy “mỗi X phút”

*/10 * * * * chạy vào các phút 0, 10, 20, 30, 40, 50, chứ không phải “cứ 10 phút kể từ khi tác vụ được tạo”. Bước của cron luôn được tính từ điểm đầu của phạm vi trong trường đó. Nếu bạn triển khai tác vụ lúc 12:03, lần chạy đầu tiên sẽ là 12:10, không phải 12:13.

Với những tác vụ thực sự cần “N phút sau lần chạy gần nhất”, hãy dùng bộ lập lịch có bộ đếm thời gian bền vững (timer của systemd với OnUnitActiveSec, hoặc lập lịch ở mức ứng dụng có lưu mốc thời gian của lần chạy gần nhất).

Những cạm bẫy của cron đáng biết

  • Đặt cả ngày trong tháng và thứ trong tuần: hầu hết các bản cron xử lý điều này theo kiểu HOẶC, nhiều khả năng không phải điều bạn muốn.
  • Bước 0: */0 không hợp lệ.
  • Phạm vi vắt qua nửa đêm: 22-2 cho giờ không hoạt động trong cron cổ điển; hãy dùng 22-23,0-2.
  • Ngày 30 tháng 2: lịch kiểu 0 0 30 2 * sẽ không bao giờ chạy.
  • Sự nhập nhằng của giờ tiết kiệm ánh sáng (DST): tác vụ được lên lịch trong khoảng 2 giờ đến 3 giờ sáng có thể chạy hai lần hoặc không chạy lần nào vào ngày chuyển đổi DST.

Cron so với các bộ lập lịch hiện đại

Cron của Unix vẫn có mặt ở khắp nơi, nhưng với những việc quan trọng thì bạn có lẽ sẽ cần một trong số sau:

  • Timer của systemd: bắt được các lần chạy bị bỏ lỡ, hỗ trợ độ lệch ngẫu nhiên, đọc cấu hình từ tệp unit.
  • Kubernetes CronJob: khai báo (declarative), hỗ trợ thử lại, nhận biết múi giờ từ phiên bản 1.25 trở lên.
  • Airflow / Prefect / Dagster: cho các tác vụ có phụ thuộc, thử lại, chạy bù dữ liệu (backfill) và khả năng quan sát.
  • Lịch của GitHub Actions: cron 5 trường, chỉ UTC, khoảng cách tối thiểu 5 phút, giao theo kiểu best-effort.

Bản thân cron là một định dạng tuyệt vời, nhưng lại là bộ lập lịch tồi cho những tác vụ không được phép bỏ lỡ.

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

Vì thứ trong tuần 0 là Chủ nhật trong cron chuẩn (và 7 cũng là Chủ nhật, nên hỗ trợ cả hai quy ước). Thứ Hai là 1. Quartz lại đánh số các thứ trong tuần từ 1 đến 7 với Chủ nhật = 1, điều này thường khiến những người chuyển qua lại giữa các triển khai bị nhầm.

Cron cổ điển trên Unix chạy theo múi giờ cục bộ của máy chủ, tức là giá trị mà /etc/timezone chỉ định. Kubernetes CronJob, GitHub Actions và phần lớn bộ lập lịch trên đám mây mặc định chạy theo UTC. Hãy luôn kiểm tra, và nếu có thể, dùng UTC để tránh những bất ngờ do giờ tiết kiệm ánh sáng (DST).

Cron cổ điển không thể diễn đạt điều này một cách trực tiếp. Cách giải quyết: chạy vào mỗi thứ Hai và kiểm tra ngày bên trong script: [ $(date +%d) -le 7 ] && ./job.sh. Quartz hỗ trợ sẵn việc này với 1#1.

Không. Mỗi lịch cần một dòng riêng. Tuy nhiên, bạn có thể gộp nhiều mốc thời gian vào một dòng bằng danh sách: 0 9,17 * * * chạy lúc 9 giờ sáng và 5 giờ chiều. Với những lịch không thể viết gọn trong một dòng, hãy thêm nhiều dòng cùng trỏ tới một lệnh.

Công cụ liên quan