Trình giải thích biểu thức Cron
Dán một biểu thức cron và hiểu chính xác nó làm gì.
Các ví dụ phổ biến
Cách đọc các biểu thức cron
Một biểu thức cron tiêu chuẩn có 5 trường được phân tách bằng khoảng trắng:
phút giờ ngày tháng thứ-trong-tuần
* · bất kỳ giá trị nào */n · cứ n đơn vị 1,5 · ở các giá trị 1 và 5 1-5 · phạm vi từ 1 đến 5
Phạm vi: phút (0-59), giờ (0-23), ngày (1-31), tháng (1-12), thứ trong tuần (0-6, 0 = Chủ nhật)
Cách thức hoạt động
- Nhập một biểu thức cron: dán một chuỗi cron 5 hoặc 6 trường như
0 9 * * 1-5. - Đọc giải thích bằng ngôn ngữ rõ ràng: công cụ ngay lập tức hiển thị một mô tả có thể đọc được về thời điểm tác vụ chạy.
- Hình dung các lần thực thi tiếp theo: một danh sách 5 đến 10 lần thực thi tiếp theo được lên lịch được hiển thị từ ngày và giờ hiện tại.
- Xác thực: các biểu thức không hợp lệ được làm nổi bật với các thông báo lỗi chính xác giải thích vấn đề.
Nửa thế kỷ tic mỗi phút
cron là bộ lập lịch cũ nhất vẫn được dùng liên tục, hằng ngày, trên phần lớn server thế giới. Lần xuất hiện đầu tiên trong sử liệu là tháng 5 năm 1975, khi một phiên bản sớm được AT&T Bell Laboratories giao trong khuôn khổ nhánh Research Unix. Tên là cái gật đầu với Chronos, hiện thân thần thoại Hy Lạp của thời gian, và thiết kế đã già đi với một sự duyên dáng kỳ lạ: cùng năm trường ngăn cách bằng khoảng trắng mà các kỹ sư Bell Labs gõ vào /usr/lib/crontab giữa thập niên 1970 vẫn lái CronJob Kubernetes, lịch GitHub Actions và sao lưu cơ sở dữ liệu hằng đêm trên một VPS đâu đó ở Frankfurt ngay lúc này. Triển khai 1975 là tối thiểu, có một crontab duy nhất, do root sở hữu, phục vụ cả máy. Nếu một người dùng muốn tác vụ định kỳ, họ phải nhờ quản trị viên thêm dòng tay. cron đi vào thế giới rộng hơn với Version 7 Unix, ra năm 1979. Robert Brown và Keith Williamson tại Đại học Purdue mở rộng cron để xử lý nhiều người dùng cuối 1979, giới thiệu luồng crontab -e theo từng người. Lần viết lại quyết định đến khi Paul Vixie phát hành vixie-cron 1.0 ngày 6 tháng 5 năm 1987; vixie-cron chính thức hóa các ký tự đặc biệt và giới thiệu các viết tắt @reboot, @hourly, @daily, @weekly, @monthly, @yearly. Vixie 3.0 (27 tháng 12 năm 1993) thêm giá trị bước (/) và được tích hợp, với các bản vá nhỏ, vào gần như mọi bản phân phối Linux và BSD thời đó. POSIX bắt kịp năm 1992 (IEEE Std 1003.2-1992). Mỗi đặc thù của cron hiện đại, đánh số lệch ngày Chủ nhật, lỗi liên/giao của các trường ngày, là một vết sẹo của tiến hóa đó; không có gì được thiết kế trong một lần.
Giải phẫu của một biểu thức năm trường
Một biểu thức cron chuẩn gồm năm trường ngăn cách bằng khoảng trắng. Từ trái sang phải, chúng hỏi: phút nào, của giờ nào, của ngày-trong-tháng nào, của tháng nào, của ngày-trong-tuần nào? Các dải chính xác không thương lượng được trong cron POSIX: 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 với cả 0 và 7 đại diện Chủ nhật. Mỗi trường nhận năm toán tử kết hợp tự do: * nghĩa là mọi giá trị hợp lệ; , ngăn cách danh sách giá trị rời rạc (0,15,30,45 * * * * chạy đúng giờ, mười lăm phút, ba mươi phút, và bốn mươi lăm phút mỗi giờ); - là dải bao trùm (9-17 trong trường giờ nghĩa là 9, 10, 11, 12, 13, 14, 15, 16, 17); / là giá trị bước (*/15 trong trường phút nghĩa là mỗi mười lăm phút bắt đầu từ không, tức 0, 15, 30, 45). Tháng và ngày trong tuần cũng có thể viết bằng viết tắt ba chữ: JAN-DEC và SUN-SAT. Một ví dụ chi tiết: */15 9-17 * * 1-5 đọc là mỗi mười lăm phút trong giờ 9 đến 17 bao gồm, mỗi ngày trong tháng, mỗi tháng trong năm, từ thứ hai đến thứ sáu, "mỗi mười lăm phút trong giờ làm việc các ngày trong tuần".
Cái bẫy ngày-trong-tháng / ngày-trong-tuần
Đặc thù cron có hậu quả nặng nhất, cái đã gây sự cố, sao lưu bị bỏ và chu kỳ hóa đơn sai âm thầm trong production suốt 35 năm, là cách cron kết hợp các trường ngày-trong-tháng và ngày-trong-tuần khi cả hai bị giới hạn. Phát biểu POSIX bất thường chính xác ở đây: "nếu cả 'ngày trong tháng' (trường 3) và 'ngày trong tuần' (trường 5) đều bị giới hạn (không chứa '*'), thì một hoặc cả hai phải khớp ngày hiện tại". Nói cách khác, khi không trường nào là wildcard, cron lấy liên (union) của hai, tác vụ chạy bất kỳ ngày nào thỏa một trong hai giới hạn. Đó là điều ngược với điều phần lớn người dùng giả định. Đọc 0 0 13 * 5 thành tiếng, "nửa đêm ngày 13, vào thứ sáu", nghe tự nhiên như giao: chỉ thứ sáu ngày 13. Trong vixie-cron và hậu duệ, nó thực ra nghĩa là "mỗi ngày 13 trong tháng và mỗi thứ sáu", chạy khoảng chín lần mỗi tháng. Tệ hơn, vixie-cron quyết định dùng liên hay giao chỉ bằng cách xem ký tự đầu của mỗi trường ngày. Bản thân Paul Vixie đã thừa nhận hành vi là bug, nhưng từ chối sửa, ghi nhận rằng sửa nó sẽ vi phạm nguyên tắc ít bất ngờ nhất, hàng triệu crontab đã được viết với giả định hành vi hiện hữu là có chủ ý. Bug nay là tính năng, bất tử và tự lan truyền. Mô hình tinh thần thực dụng: nếu bạn thấy mình giới hạn cả ngày-trong-tháng và ngày-trong-tuần và bạn thực sự muốn giao (ví dụ "thứ ba thứ hai của mỗi tháng"), hãy dùng toán tử # trong các triển khai hỗ trợ (Quartz, cronie với mở rộng): 0 12 ? * 2#2. Trong cron POSIX thuần, giao thực sự không thể diễn đạt trong một biểu thức duy nhất và bạn phải lọc bên trong script mà cron gọi.
Các macro tắt
@yearly/@annually=0 0 1 1 *, nửa đêm ngày 1 tháng 1@monthly=0 0 1 * *, nửa đêm ngày 1 mỗi tháng@weekly=0 0 * * 0, nửa đêm Chủ nhật@daily/@midnight=0 0 * * *, nửa đêm mỗi ngày@hourly=0 * * * *, đúng giờ mỗi giờ@reboot, đặc biệt: kích hoạt một lần khi daemon cron khởi động (không phải một lần mỗi lần khởi động lại hệ thống, trên hệ thống nơi cron có thể bị dừng và chạy lại,@rebootsẽ kích hoạt lại)
Các viết tắt này không phải phần của POSIX. Môi trường POSIX nghiêm sẽ từ chối @daily; trên thực tế, mọi triển khai cron mà người đọc có khả năng gặp (vixie-cron, cronie, fcron, ISC cron, image container) đều hỗ trợ chúng.
Các phương ngữ, chuẩn vs Quartz vs AWS vs K8s vs systemd
"Biểu thức cron" nay là một họ nhỏ các phương ngữ không tương thích nhau. cron 5 trường chuẩn (POSIX, vixie-cron, cronie): phút giờ ngày-trong-tháng tháng ngày-trong-tuần, mẫu số chung phổ quát nhỏ nhất. Quartz Scheduler (6 hoặc 7 trường, hệ sinh thái Java): giây phút giờ ngày-trong-tháng tháng ngày-trong-tuần [năm]; giới thiệu ?, L (last), W (weekday), # (ngày-trong-tuần thứ n của tháng). @Scheduled của Spring và Spring Boot dùng Quartz. Kubernetes CronJob dùng cron 5 trường chuẩn, với trường spec.timeZone riêng đã đạt GA trong K8s 1.27 (chính tài nguyên CronJob đạt GA trong 1.21, tháng 4 năm 2021); định dạng múi giờ là cơ sở IANA tz (Europe/Berlin, America/New_York). Lịch cron của GitHub Actions dùng cron POSIX 5 trường và chạy theo UTC. cron của AWS EventBridge dùng 6 trường (phút giờ ngày-trong-tháng tháng ngày-trong-tuần năm), đòi toán tử ? trên ngày-trong-tháng hoặc ngày-trong-tuần (bạn không thể giới hạn cả hai), và dùng 1-7 với SUN=1, nghĩa là một biểu thức EventBridge 0 12 ? * 2 * chạy lúc giữa trưa thứ hai, không phải thứ ba. Timer systemd dùng cú pháp hoàn toàn khác (OnCalendar=*-*-* 02:00:00) và đang dần thay thế cron trên Linux hiện đại cho lập lịch hệ thống, dù cả hai cùng được giao trên mọi distro lớn. Cloud Scheduler (Google Cloud) dùng cron 5 trường chuẩn với cấu hình múi giờ tường minh. Dịch biểu thức giữa các nền tảng đòi chú ý cẩn thận: một lịch EventBridge sao chép-dán sẽ chạy sai ngày trong tuần trong vixie-cron vì lệch đánh số ngày.
Khuôn mẫu phổ biến cần ghi nhớ
*/15 * * * *, mỗi 15 phút (00:00, 00:15, 00:30, 00:45 mỗi giờ)*/15 9-17 * * 1-5, mỗi 15 phút trong giờ làm việc, chỉ ngày trong tuần0 9 * * 1-5, mỗi ngày trong tuần lúc 9 giờ0 6,18 * * *, hai lần một ngày, lúc 6 giờ và 18 giờ (qua danh sách, không phải dải)0 0 1 * *, nửa đêm ngày 1 mỗi tháng0 0 L * *, nửa đêm ngày cuối mỗi tháng (Llà mở rộng Quartz/cronie)0 3 1-7 * 1, thứ hai đầu tiên mỗi tháng lúc 3 giờ (cố ý dùng bug liên: khớp ngày 1-7 VÀ thứ hai, nhưng những ngày duy nhất thỏa cả hai giới hạn trong một tháng cho trước là thứ hai đầu tiên)0 0 1 1,4,7,10 *, nửa đêm ngày đầu mỗi quý dương lịch0 0 * * 0,6, nửa đêm cuối tuần
Cạm bẫy phổ biến
Múi giờ. cron mặc định dùng giờ địa phương của hệ thống, gây ngạc nhiên trên máy cloud mặc định UTC. Một tác vụ cron lúc 9 giờ trên server UTC kích hoạt lúc 4 giờ giờ New York. Các bộ lập lịch hiện đại (Kubernetes 1.27+, AWS EventBridge, Cloud Scheduler) đã thêm trường múi giờ tường minh; cron cổ điển không. Quy tắc "*/N bắt đầu từ 0". */15 cho 0, 15, 30, 45, không phải 5, 20, 35, 50. Để bắt đầu ở offset khác không, bạn phải liệt kê (5,20,35,50) hoặc dùng cú pháp chỉ-Quartz 5/15. Cái bẫy chồng chất 60 phút. Một tác vụ chạy lâu hơn khoảng lập lịch của nó có thể chồng lên nhau, ba bản sao lưu 30 phút khởi động mỗi 15 phút sẽ chồng chéo. Cách tránh chuẩn là flock(1): * * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/myjob đảm bảo chỉ một instance chạy cùng lúc; cờ -n làm việc lấy khóa không-chặn, nên các lần gọi sau kết thúc âm thầm thay vì xếp hàng. Bất thường giờ tiết kiệm ánh sáng ngày. Một tác vụ cron lập lịch lúc 02:30 sẽ kích hoạt hai lần vào ngày đồng hồ lùi và không lần nào vào ngày đồng hồ tiến. cron không có khái niệm "giờ đồng hồ tính cả DST"; nếu lịch của bạn phải tránh chuyển DST, hãy neo nó vào giờ không bị ảnh hưởng (3 giờ hoặc muộn hơn ở phần lớn múi giờ) hoặc dùng bộ lập lịch hiểu ngữ nghĩa múi giờ. Tước PATH. Tác vụ cron chạy với PATH tối thiểu (/usr/bin:/bin) và môi trường gần như rỗng; script chạy được trong shell tương tác có thể thất bại trong cron vì node, python3 hay aws không có trong PATH kế thừa. Hoặc bạn đặt PATH= ở đầu crontab, hoặc dùng đường dẫn tuyệt đối trong lệnh cron. Tràn thư. Theo mặc định, cron gửi đầu ra của mỗi tác vụ đến hộp thư cục bộ của người dùng; trên server không cấu hình mail, điều đó âm thầm làm đầy /var/spool/mail đến khi đĩa đầy. Hoặc bạn chuyển hướng đầu ra (>/dev/null 2>&1), hoặc đặt MAILTO="" ở đầu crontab, hoặc thực sự cấu hình chuyển tiếp thư.
Phương án hiện đại, khi nào nhắm thứ khác
cron xuất sắc cho tác vụ định kỳ đơn giản trên một máy duy nhất. Nó tệ ở: lập lịch phân tán (cùng tác vụ kích hoạt một lần trên cả hạm đội thay vì một lần mỗi máy), kích hoạt theo sự kiện (chạy khi hàng đợi tin nhắn nhận tin, không phải theo đồng hồ), giám sát (cron thất bại âm thầm nếu tác vụ ra với mã khác không, trừ khi bạn cấu hình chuyển tiếp email), thử lại (không có cơ chế tích hợp, tác vụ thất bại chạy lại ở chu kỳ kế và tích lũy trạng thái), và phụ thuộc (chạy tác vụ B chỉ sau khi tác vụ A thành công). Cho các trường hợp đó, câu trả lời hiện đại là một trong: Kubernetes CronJob (lập lịch hướng cluster với chính sách thử lại và song song), AWS EventBridge + Lambda hoặc Step Functions (theo sự kiện với khả năng quan sát tích hợp), Apache Airflow hoặc Prefect (điều phối workflow DAG với phụ thuộc tường minh), Temporal (thực thi workflow bền), healthchecks.io (một "công tắc người chết" báo bạn khi tác vụ cron không chạy đúng giờ). Cho tác vụ định kỳ trên máy đơn năm 2026, cron đơn giản vẫn là câu trả lời đúng; cho mọi thứ khác, một trong các phương án đáng cấu hình thêm.
Câu hỏi thường gặp
* nghĩa là gì trong biểu thức cron?
Một dấu sao (*) trong trường cron nghĩa là "mọi giá trị hợp lệ", mỗi phút, mỗi giờ, mỗi ngày, mỗi tháng, mỗi ngày-trong-tuần. * * * * * chạy mỗi phút mỗi ngày. Dấu sao cũng đặc biệt trong trường ngày-trong-tháng và ngày-trong-tuần vì cái bẫy liên-vs-giao: khi một trong hai trường ngày có * dẫn đầu, vixie-cron dùng chế độ giao; khi không có cái nào, nó dùng chế độ liên và chạy trên liên của hai giới hạn.
Làm sao chạy tác vụ cron mỗi 15 phút?
Dùng ký pháp bước: */15 * * * * chạy mỗi 15 phút, lúc xx:00, xx:15, xx:30 và xx:45. Lưu ý */N luôn bắt đầu từ 0; bạn không thể dùng */15 để nói "mỗi 15 phút bắt đầu từ phút 5", cho việc đó bạn sẽ viết 5,20,35,50 * * * *. cron phương ngữ Quartz hỗ trợ 5/15 như phương án không chuẩn.
Khác biệt giữa cron và at là gì?
cron chạy tác vụ theo lịch lặp (mỗi phút, mỗi ngày, mỗi tuần). Lệnh at lập lịch một tác vụ duy nhất chạy ở thời điểm tương lai cụ thể, at 14:30 tomorrow đặt tác vụ vào hàng đợi cho riêng khoảnh khắc đó. Dùng cron cho tác vụ định kỳ và at cho lần chạy tương lai duy nhất. Cả hai bắt nguồn từ cùng dòng dõi Bell Labs / vixie-cron và cuối cùng được tích hợp vào cùng daemon trên phần lớn hệ thống.
Vì sao tác vụ cron của tôi không khớp điều tôi muốn?
Năm nguyên nhân thường gặp nhất, theo thứ tự xấp xỉ: (1) Nhầm ngày-trong-tháng và ngày-trong-tuần, cron dùng liên của hai khi cả hai bị giới hạn, không phải giao. (2) Múi giờ, cron mặc định dùng giờ địa phương của server, thường UTC trên máy cloud. (3) Vấn đề PATH, PATH của shell tương tác không được kế thừa, nên lệnh chạy được ở dấu nhắc có thể thất bại trong cron. (4) Cái bẫy */N luôn bắt đầu từ 0. (5) Đầu ra không được bắt ở đâu, tác vụ thất bại biến mất âm thầm nếu bạn không cấu hình email hoặc chuyển hướng đầu ra đến tệp log. Bảng "10 lần chạy lập lịch tiếp theo" của công cụ này là cách tiết kiệm nhất để xác minh biểu thức của bạn thực sự nghĩa là gì trước khi triển khai.
Công cụ này có hỗ trợ định dạng cron không chuẩn không?
Nó xử lý cron POSIX/vixie-cron 5 trường chuẩn, biến thể Quartz/Spring 6 trường có giây, và các chuỗi đặc biệt @hourly, @daily, @weekly, @monthly, @yearly và @reboot. Nó không xử lý mở rộng Quartz đầy đủ (L, W, #) hay đánh số ngày dựa-trên-1 của AWS EventBridge, cho những cái đó hãy dùng trình xác thực của nền tảng trước triển khai.
Biểu thức cron của tôi có được gửi đi đâu không?
Không. Việc phân tích và giải thích chạy hoàn toàn trong trình duyệt qua JavaScript. Biểu thức được dán không bao giờ đi qua mạng, hãy kiểm chứng trong tab Network của DevTools khi bạn bấm Giải thích. An toàn cho biểu thức cron trong cấu hình CI production, mã hạ tầng và runbook vận hành nơi bản thân lịch có thể nhạy cảm (ví dụ lịch xuất cơ sở dữ liệu hằng đêm chỉ ra cửa sổ bảo trì).