fixmint
VI

Cách đọc biểu thức cron, từng trường một

Tác giả: · · 5 phút đọc

Biểu thức cron là một dòng văn bản ngắn cho bộ lập lịch biết khi nào chạy một tác vụ. Dạng thường gặp có năm trường, ngăn cách bằng dấu cách: phút, giờ, ngày trong tháng, tháng và thứ trong tuần. Dòng 0 9 * * 1-5 nghĩa là 09:00 từ thứ Hai đến thứ Sáu. Mỗi trường là một số, một tên, một danh sách, một khoảng hoặc một bước, hoặc * cho mọi giá trị. Tác vụ chạy vào mỗi thời điểm mà tất cả các trường đều khớp.

Giải thích biểu thức cronCron chạy sai thời gianDùng miễn phí

Năm trường

TrườngGiá trị cho phépVí dụ
Phút0 đến 5930 là phút thứ 30 của giờ
Giờ0 đến 239 là 09:00, theo đồng hồ 24 giờ
Ngày trong tháng1 đến 3115 là ngày 15
Tháng1 đến 12, hoặc JAN đến DEC3 hoặc MAR là tháng 3
Thứ trong tuần0 đến 6, hoặc SUN đến SAT0 hoặc SUN là Chủ nhật, 1 là thứ Hai

Một số hệ thống cũng chấp nhận 7 cho Chủ nhật, nhưng không phải hệ thống nào cũng vậy, nên hãy dùng 0 hoặc SUN. Dạng này của cron không có trường giây, nên bước nhỏ nhất là một phút.

Danh sách, khoảng, bước và tên

  • nghĩa là mọi giá trị trong trường. * * * * chạy mỗi phút.
  • Danh sách dùng dấu phẩy. 0 9,17 * * * chạy lúc 09:00 và 17:00 mỗi ngày.
  • Khoảng dùng dấu gạch ngang. 1-5 ở trường thứ trong tuần nghĩa là thứ Hai đến thứ Sáu.
  • Bước dùng dấu gạch chéo. */15 ở trường phút nghĩa là 0, 15, 30 và 45. 10-30/5 nghĩa là 10, 15, 20, 25 và 30.
  • Tên như MON-FRI có thể thay cho số. Chúng dễ đọc hơn, nếu bộ lập lịch của bạn chấp nhận.

Các phần này có thể kết hợp. 0 8-18/2 * * * chạy vào phút 0 của mỗi hai giờ một lần từ 08:00 đến 18:00.

Lịch chạy thường gặp

Biểu thứcÝ nghĩa
* * * * *Mỗi phút
/15 * * *Mỗi 15 phút
0 * * * *Vào phút 0 của mỗi giờ
0 2 * * *Mỗi ngày lúc 02:00
0 9 * * 1-509:00, thứ Hai đến thứ Sáu
0 9,17 * * *09:00 và 17:00 mỗi ngày
30 6 1 * *06:30 ngày 1 hằng tháng
0 0 * * 0Nửa đêm mỗi Chủ nhật
0 0 1 1 *Nửa đêm ngày 1 tháng 1
/5 9-17 * 1-5Mỗi 5 phút từ 09:00 đến 17:55, thứ Hai đến thứ Sáu

Lưu ý rằng 0 0 * * là nửa đêm, còn 0 12 * * là giữa trưa. Đặt sai giờ là một trong những lỗi phổ biến nhất.

Ngày trong tháng và thứ trong tuần

Khi cả trường ngày trong tháng và trường thứ trong tuần đều bị giới hạn, tác vụ chạy khi một trong hai khớp. Đây là quy tắc kinh điển của Vixie cron và nhiều hệ thống được phát triển từ nó. Vì vậy 0 0 13 * 5 chạy lúc nửa đêm ngày 13 hằng tháng và cũng chạy mỗi thứ Sáu. Nhiều người chỉ mong đợi thứ Sáu ngày 13, rồi thấy số lần chạy nhiều hơn dự định.

Nếu một trong hai trường là *, chỉ trường còn lại được tính. Để chạy vào thứ Sáu ngày 13, hãy lên lịch tác vụ cho mỗi thứ Sáu rồi kiểm tra ngày ngay trong script. Các bộ lập lịch khác, kể cả một số dịch vụ đám mây, có thể dùng quy tắc khác, nên hãy đọc tài liệu của chúng.

Múi giờ và giờ tiết kiệm ánh sáng

Cron chạy theo đồng hồ của máy hoặc dịch vụ chạy nó, thường là múi giờ địa phương của máy đó. Tác vụ đặt lúc 02:30 sẽ chạy lúc 02:30 theo đồng hồ đó. Hãy kiểm tra múi giờ trước (trên Linux, lệnh date sẽ hiển thị). Nếu bạn muốn mọi tác vụ theo một đồng hồ duy nhất, nhiều nhóm chạy máy chủ ở UTC, và một số bộ lập lịch cho phép đặt múi giờ riêng cho từng tác vụ.

Giờ tiết kiệm ánh sáng đổi đồng hồ hai lần một năm. Vào mùa xuân, nhiều nơi nhảy từ 02:00 thẳng sang 03:00, nên tác vụ lúc 02:30 không có thời điểm nào để chạy. Vào mùa thu, khoảng từ 01:00 đến 01:59 xảy ra hai lần. Các bộ lập lịch xử lý những trường hợp này khác nhau. Có cái bỏ qua tác vụ, có cái chạy một lần, có cái chạy hai lần. Hãy tránh đặt tác vụ trong khoảng đổi giờ vào sáng sớm, hoặc dùng UTC, nếu sự khác biệt này quan trọng với bạn.

Sáu trường và Quartz

Một số bộ lập lịch thêm trường giây ở đầu, nên /10 * * * * chạy mỗi 10 giây. Bộ lập lịch Quartz cho Java dùng giây, phút, giờ, ngày trong tháng, tháng, thứ trong tuần và năm tùy chọn, và thêm bốn ký tự đặc biệt:

  • ? nghĩa là "không có giá trị cụ thể". Quartz yêu cầu dùng nó ở trường ngày trong tháng hoặc trường thứ trong tuần, tùy trường nào bạn không đặt.
  • L nghĩa là cuối. L ở trường ngày trong tháng là ngày cuối cùng của tháng, còn 6L ở trường thứ trong tuần là thứ Sáu cuối cùng.
  • W nghĩa là ngày trong tuần (từ thứ Hai đến thứ Sáu) gần nhất. 15W là ngày trong tuần gần ngày 15 nhất, và nó không nhảy sang tháng khác.
  • # nghĩa là thứ thứ n trong tháng. 6#3 là thứ Sáu thứ ba.

Quartz đánh số ngày khác với dạng năm trường. Số 1 của nó là Chủ nhật và 7 là thứ Bảy, nên thứ Hai đến thứ Sáu là 2-6, không phải 1-5. Luôn kiểm tra bộ lập lịch của bạn dùng định dạng nào trước khi sao chép một dòng.

Lỗi thường gặp

  • */7 ở trường phút. Các giá trị là 0, 7, 14 và cứ thế đến 56. Giá trị tiếp theo sẽ là 63, không tồn tại, nên lần chạy sau 56 là vào phút 0 của giờ kế tiếp. Khoảng cách chỉ lệch bốn phút và các lần chạy không đều. Hãy dùng bước chia hết cho 60, như 5, 10, 15 hoặc 30.
  • Ngày 30 tháng 2. Ngày này không tồn tại, nên 0 0 30 2 * không bao giờ chạy. Tương tự với ngày 31 của tháng có 30 ngày. Theo quy tắc HOẶC, một giới hạn về thứ trong tuần vẫn có thể khiến tác vụ chạy vào các ngày khác, nên hãy kiểm tra kết quả.
  • Giờ 24 hoặc phút 60. Các giá trị này nằm ngoài phạm vi. Hầu hết bộ lập lịch sẽ từ chối khi bạn lưu, nhưng không phải tất cả.
  • Kỳ vọng có giây. Dòng năm trường chỉ chạy vào các phút tròn.
  • Nhầm cron với biểu thức chính quy. Trong cron, nghĩa là mọi giá trị. Trong biểu thức chính quy, nghĩa là lặp lại mục đứng trước nó. Hãy dùng Kiểm tra regex cho các mẫu, và giữ dòng cron tách riêng.

Kiểm tra các lần chạy tiếp theo

Trước khi tin vào một lịch, hãy đọc dòng đó bằng ngôn ngữ dễ hiểu và liệt kê vài thời điểm chạy kế tiếp. Giải thích biểu thức cron làm được cả hai, và đó là cách nhanh nhất để phát hiện quy tắc HOẶC hoặc một bước lạ.

Trả lời nhanh

Trường đầu tiên là phút hay giây?

Phút, trong dạng năm trường tiêu chuẩn. Chỉ một số bộ lập lịch sáu trường mới thêm giây, và chúng đặt giây ở đầu.

Vì sao tác vụ của tôi chạy vào các thứ Sáu và cả ngày 13?

Cả trường ngày trong tháng và trường thứ trong tuần đều được đặt, nên tác vụ chạy khi một trong hai khớp. Đặt một trường thành * nếu bạn chỉ muốn trường còn lại.

Cron có dùng UTC không?

Chỉ khi máy hoặc dịch vụ được đặt UTC. Nếu không, nó dùng múi giờ địa phương của hệ thống đó.

Được dịch từ Bản tiếng Anh với sự hỗ trợ của AI.

Bình luận

    Chưa có bình luận nào. Hãy là người đầu tiên.

    Đánh giá của bạn (không bắt buộc)

    Email của bạn không bao giờ được hiển thị hoặc lưu lại.

    Bìa của Agentic AI in the BrowserAgentic AI in the Browser

    Các ví dụ ứng dụng quy trình AI chạy trên trình duyệt, ưu tiên quyền riêng tư: ý tưởng làm mọi việc ngay trên thiết bị của bạn, cũng là nền tảng của fixmint.

    $4.99Mua trên GumroadBản tiếng Anh