Trình tạo biểu thức Cron

Xây dựng và hiểu các lịch trình tác vụ cron một cách trực quan.

Cài đặt sẵn nhanh

* * * * *

5 lần thực thi tiếp theo

Tham khảo cú pháp cron

* · bất kỳ giá trị nào

*/5 · cứ 5 đơn vị

1,15 · ở các giá trị 1 và 15

1-5 · phạm vi từ 1 đến 5

Trường: phút (0-59), giờ (0-23), ngày trong tháng (1-31), tháng (1-12), thứ trong tuần (0-6, 0=Chủ nhật)

Lịch sử ngắn của biểu thức cron

Biểu thức cron năm trường có từ tháng 5 năm 1975, khi một phiên bản đầu được phát hành từ AT&T Bell Laboratories như một phần của Research Unix Phiên bản 7. Tên ám chỉ Chronos, hiện thân Hy Lạp của thời gian. Định dạng đơn giản: năm trường được phân tách bằng khoảng trắng (phút, giờ, ngày-trong-tháng, tháng, ngày-trong-tuần) trên một dòng trong /usr/lib/crontab. Việc viết lại Vixie cron bởi Paul Vixie năm 1987 đã trở thành triển khai hiện đại trên thực tế; mọi bản phân phối Linux lớn đều xuất xưởng một cron có nguồn gốc Vixie, và Vixie đã thêm crontab theo người dùng, hỗ trợ biến môi trường (MAILTO=, CRON_TZ=), và các macro phím tắt @hourly / @daily / @reboot mà mọi người sử dụng ngày nay. Cú pháp biểu thức cron sau đó rẽ nhánh thành hai đường. Quartz Scheduler (Java, James House, 1998; quyên góp cho Apache và Terracotta) đã thêm trường giây đứng đầu, trường năm tùy chọn đứng cuối, và các toán tử L (cuối cùng) / W (ngày làm việc) / # (lần xuất hiện thứ n), tạo ra cron sáu trường mà AWS EventBridge (ban đầu là CloudWatch Events, 2014) và chú thích @Scheduled của Spring sau đó đã áp dụng. Định dạng NCronTab được sử dụng bởi Azure Functions (2016) đặt giây đầu tiên nhưng giữ năm trường hành vi. Kỷ nguyên đám mây sau đó đã chuẩn hóa định dạng Vixie năm trường làm ngôn ngữ chung: Kubernetes CronJobs (alpha 1.4 năm 2016, GA trong 1.21 năm 2021) chấp nhận chính xác năm trường, cũng như GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018), và Vercel Cron Jobs (2022). Các trình xây dựng cron trực quan, danh mục mà công cụ này thuộc về, xuất hiện vào khoảng 2010-2015: crontab.guru (Christine Dodrill, 2014) trở thành tài liệu tham khảo được trích dẫn nhiều nhất, và thư viện cron-descriptor (Brady Holt, ban đầu là .NET, được chuyển sang Java/Python/JS) đã hỗ trợ hầu hết các lớp dịch «cron bằng tiếng Anh đơn giản» mà các bộ giải mã và trình tạo dựa vào. Nửa thế kỷ sau Bell Labs, cùng năm trường này vẫn đang lên lịch các bản sao lưu hàng đêm của thế giới.

Giải phẫu của một biểu thức cron

Nơi biểu thức được sử dụng

Tiêu chuẩn, phương ngữ và cột mốc

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

Năm trường có giống như sáu hoặc bảy không?

Không. Hình thức POSIX cổ điển là năm trường (phút, giờ, ngày-trong-tháng, tháng, ngày-trong-tuần). Quartz và Spring sử dụng sáu trường bằng cách thêm cột giây đầu, và Quartz chấp nhận trường năm tùy chọn thứ bảy. AWS EventBridge luôn sử dụng sáu trường kết thúc bằng năm (cron(min hr dom mon dow yr)). Dán biểu thức năm trường vào Quartz hoặc Spring tạo ra lỗi cú pháp; dán biểu thức sáu trường vào Linux thầm lặng hiểu sai các trường.

Khoảng thời gian nhỏ nhất mà cron có thể thể hiện là gì?

Mỗi phút (* * * * *) trên cron Unix tiêu chuẩn. Không có trường giây tích hợp. Các trình lên lịch như Quartz hoặc NCronTab thêm một cái nếu bạn cần nhịp dưới một phút, và timer systemd có thể sử dụng OnUnitActiveSec=30s. GitHub Actions giới hạn nhịp ngắn nhất ở 5 phút, và EventBridge kích hoạt trong cửa sổ 60 giây của thời gian đã lên lịch, vì vậy đừng dựa vào cron cho độ chính xác thời gian thực cứng.

Làm thế nào để tôi chạy một công việc vào ngày cuối cùng của tháng?

Cron năm trường tiêu chuẩn không có toán tử native «ngày cuối cùng của tháng». Quartz và AWS EventBridge hỗ trợ L trong trường ngày-trong-tháng: 0 0 L * ? kích hoạt vào nửa đêm vào ngày cuối cùng. Trên cron Linux thuần túy, cách giải quyết thông thường là lên lịch hàng ngày vào các ngày ứng viên và kiểm soát lệnh: 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. Timer systemd thể hiện nó trực tiếp với OnCalendar=*-*-* 00:00:00.

Tại sao công việc cron của tôi không chạy khi tôi mong đợi?

Các nghi phạm thông thường, theo thứ tự: (1) máy chủ ở múi giờ khác với những gì bạn giả định (kiểm tra với date); (2) PATH không phải là những gì shell tương tác của bạn có, vì vậy một lệnh hoạt động ở dấu nhắc nhưng thất bại dưới cron (sử dụng đường dẫn tuyệt đối); (3) đầu ra đến email và bạn đã bỏ lỡ nó (đặt MAILTO="" hoặc chuyển hướng đến tệp nhật ký); (4) cron daemon không chạy (systemctl status cron); (5) cái bẫy OR (xem ở trên) đang kích hoạt vào những ngày bổ sung mà bạn không có ý định.

Sự khác biệt giữa cron, anacron và timer systemd là gì?

Cron mong đợi hệ thống đang chạy vào thời gian đã lên lịch và bỏ qua một cách lặng lẽ các công việc rơi vào trong thời gian ngừng hoạt động: tốt cho các máy chủ luôn bật, không tốt cho laptop. Anacron theo dõi dấu thời gian chạy lần cuối theo công việc và bắt kịp các công việc bị bỏ lỡ sau khi khởi động lại, với chi phí độ chính xác cấp ngày thay vì phút. Timer systemd thay thế cron trên hầu hết các bản phân phối Linux hiện đại: chúng hỗ trợ cả lịch trình lịch và đơn điệu, ghi nhật ký vào journald, có thể khai báo phụ thuộc dịch vụ, và sử dụng Persistent=true để kết hợp độ chính xác kiểu cron với khả năng bắt kịp kiểu anacron.

Múi giờ và giờ tiết kiệm ánh sáng ban ngày ảnh hưởng đến cron như thế nào?

Hầu hết các cron daemon diễn giải lịch trình trong múi giờ hệ thống. Trên các máy chủ đám mây, điều đó thường có nghĩa là UTC, vì vậy 0 9 * * * kích hoạt vào lúc 9 giờ sáng UTC, không phải 9 giờ sáng địa phương. Đặt CRON_TZ=America/New_York trong crontab Linux; Kubernetes sử dụng spec.timeZone; AWS, GCP, và Vercel mỗi cái nhận một múi giờ IANA rõ ràng. Trong quá trình mùa xuân tiến lên, các công việc được lên lịch vào giờ bị bỏ qua được chạy ngay sau đó bởi Vixie cron nhưng bị bỏ qua hoàn toàn bởi AWS EventBridge. Mẫu an toàn nhất là để cron ở UTC và chuyển đổi bên trong công việc.

Công cụ liên quan