Bạn cài cron job backup database lúc 2 giờ sáng mỗi ngày để server yên tĩnh. Ba tháng sau nhìn lại log, backup đang chạy lúc 9 giờ tối — đúng 2 giờ sáng theo UTC, nhưng server của bạn đặt múi giờ Vietnam là UTC+7. Hoặc bạn viết 0 8 * * 1-5 định là "8 giờ sáng mỗi ngày trong tuần", nhưng thứ Hai không có job chạy vì 1-5 trong trường ngày-trong-tuần là thứ Hai đến thứ Sáu theo chuẩn 0=Chủ Nhật của crontab — hoặc ngược lại tùy hệ thống.

Cron job sai không báo lỗi, không crash — nó cứ chạy, nhưng chạy sai giờ hoặc sai ngày. Bài này hướng dẫn cách viết biểu thức cron đúng từ đầu, test trước khi deploy, và kiểm tra múi giờ server để không bị bẫy.

Tạo biểu thức nhanh: mở công cụ tạo cron, chọn tần suất trên giao diện trực quan, biểu thức cron sẽ được sinh tự động. Không cần học thuộc cú pháp, không cần đăng nhập.

Cú pháp cron: 5 trường và ý nghĩa từng trường

Một biểu thức cron chuẩn gồm 5 trường cách nhau bởi khoảng trắng, mỗi trường kiểm soát một chiều thời gian:

*  *  *  *  *
|  |  |  |  |
|  |  |  |  +-- Ngay trong tuan (0-7, ca 0 va 7 deu la Chu Nhat)
|  |  |  +----- Thang (1-12)
|  |  +-------- Ngay trong thang (1-31)
|  +----------- Gio (0-23)
+-------------- Phut (0-59)

Các ký hiệu đặc biệt:

Ký hiệuÝ nghĩaVí dụ*Mọi giá trị* * * * * — mỗi phút,Liệt kê nhiều giá trị0 9,17 * * * — 9 giờ và 17 giờ-Khoảng giá trị0 9-17 * * * — mỗi giờ từ 9 đến 17*/nMỗi n đơn vị*/15 * * * * — mỗi 15 phút

Một số mẫu hay dùng cho lập trình viên:

Mục đíchBiểu thứcGiải thíchMỗi phút* * * * *Test cron, không dùng productionMỗi giờ đúng0 * * * *Đồng bộ định kỳ nhẹ2 giờ sáng hàng ngày0 2 * * *Backup, cleanup8 giờ sáng thứ Hai-Sáu0 8 * * 1-5Report đầu ngày làm việcNgày 1 mỗi tháng0 0 1 * *Báo cáo tháng, invoiceMỗi 15 phút*/15 * * * *Health check, sync

4 bước viết và kiểm tra biểu thức cron

Bước 1 — Tạo biểu thức bằng giao diện trực quan

Thay vì học thuộc và viết cú pháp thủ công, bạn chọn tần suất mong muốn trên giao diện — công cụ sinh biểu thức tự động và giải thích lại bằng ngôn ngữ thường để xác nhận.

👉 Tạo biểu thức: công cụ tạo cron (chọn phút/giờ/ngày/tháng, công cụ sinh cron expression tự động).

Ví dụ: chọn "mỗi ngày lúc 2 giờ sáng" → công cụ sinh ra 0 2 * * * và giải thích "Runs at 02:00 every day". Copy biểu thức này vào crontab hoặc config scheduler.

Lỗi hay gặp:

  • Nhầm thứ tự trường: nhiều người nhầm thứ tự giờ phút thay vì phút giờ. 0 2 * * * là "phút 0 của giờ 2" (tức 2:00 sáng), còn 2 0 * * * là "phút 2 của giờ 0" (tức 0:02 sáng).

  • Dùng cú pháp mở rộng không tương thích: một số scheduler (NestJS @nestjs/schedule, GitHub Actions) hỗ trợ thêm trường thứ 6 cho giây (0/30 * * * * *). Crontab truyền thống của Linux chỉ có 5 trường — điền 6 trường là lỗi ngay.

Bước 2 — Validate biểu thức và xem lịch chạy thực tế

Sau khi có biểu thức, bước tiếp theo là xác nhận nó chạy đúng lịch mong muốn bằng cách xem trước 5-10 lần chạy tiếp theo.

👉 Validate: công cụ kiểm tra cron (nhập biểu thức, xem danh sách thời điểm chạy tiếp theo).

Ví dụ: nhập 0 2 * * * — công cụ hiện:

Next runs:
  2026-07-01 02:00:00
  2026-07-02 02:00:00
  2026-07-03 02:00:00
  ...

Nhìn vào danh sách này bạn xác nhận ngay "đúng rồi, mỗi ngày 2 giờ sáng". Nếu thấy lịch không như kỳ vọng, quay lại sửa biểu thức.

Lỗi hay gặp:

  • 0 8 * * 1-5 không chạy thứ Hai: Một số hệ thống dùng 0=Chủ Nhật, 1=Thứ Hai … 6=Thứ Bảy, số khác dùng 1=Thứ Hai … 7=Chủ Nhật. Dùng công cụ validate xem lịch thực tế để xác nhận hệ thống của bạn đang dùng quy ước nào.

Bước 3 — Kiểm tra múi giờ server (bẫy lớn nhất)

Cron chạy theo múi giờ của hệ thống server — không tự động điều chỉnh theo múi giờ bạn muốn. Server cloud hoặc VPS mới deploy thường mặc định là UTC, trong khi bạn đang nghĩ theo giờ Việt Nam (UTC+7).

👉 Xem chênh lệch múi giờ: công cụ chuyển đổi múi giờ (nhập giờ bạn muốn theo VN, xem tương đương UTC để điền vào cron).

Quy đổi nhanh: giờ Việt Nam = UTC + 7. Muốn cron chạy lúc 2 giờ sáng giờ Hà Nội → điền 0 19 * * * (19:00 UTC ngày hôm trước).

Để kiểm tra múi giờ server đang dùng:

timedatectl
date +%Z

Lỗi hay gặp:

  • Backup chạy đúng giờ UTC, sai giờ VN: lỗi phổ biến nhất. Muốn backup 2 giờ sáng VN → cron phải là 0 19 * * * trên server UTC, không phải 0 2 * * *.

  • Quên đổi giờ theo Daylight Saving Time (DST): Việt Nam không có DST, nhưng nếu server deploy ở zone Europe/London hay America/New_York thì cron có thể chạy sai 1 giờ vào mùa hè. Dùng UTC cho server production để tránh vấn đề này.

Bước 4 — Xác nhận thời điểm chạy thực tế qua timestamp

Sau khi deploy, bạn muốn kiểm tra log để xác nhận cron đã chạy đúng giờ chưa. Log thường ghi timestamp dạng Unix epoch — cần chuyển về giờ đọc được để so sánh.

👉 Chuyển timestamp: công cụ unix timestamp (dán số epoch từ log, xem ngay là ngày giờ nào theo múi giờ Việt Nam).

Ví dụ: log ghi job_started_at: 1751331600 → paste vào công cụ → ra 2026-07-01 02:00:00 +07:00 — xác nhận đúng 2 giờ sáng giờ Hà Nội. Nếu ra giờ lạ, có thể server đang chạy theo UTC và cron chưa được điều chỉnh.

Cron deploy xong kiểm tra thế nào?

  • Thời gian chờ kết quả: nếu cron chạy hàng ngày, bạn phải chờ đến lần chạy đầu tiên để biết có đúng không. Cách test nhanh hơn là tạm đổi sang * * * * * (mỗi phút) để chạy thử ngay, xem log, rồi đổi lại tần suất thực.

  • Cron không chạy: kiểm tra process cron/crond đang chạy chưa, file crontab có quyền đúng không, và script được gọi có execute permission không.

  • Cron chạy nhưng script lỗi im lặng: cron không tự gửi lỗi ra stdout. Thêm redirect >> /var/log/mycron.log 2>&1 vào cuối dòng cron để bắt cả stderr vào log.

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

Cron và crontab có khác nhau không? Cron là daemon chạy nền trên Linux. Crontab (cron table) là file chứa danh sách các job và biểu thức thời gian. Bạn dùng lệnh crontab -e để chỉnh sửa file crontab của user hiện tại.

Biểu thức cron 6 trường dùng ở đâu? Một số framework và scheduler mở rộng cú pháp cron thêm trường giây ở đầu hoặc năm ở cuối. Ví dụ NestJS @nestjs/schedule dùng * * * * * * (6 trường, thêm giây). GitHub Actions cron cũng có thể khác. Luôn kiểm tra tài liệu của công cụ bạn đang dùng.

Tôi dùng cron trong Docker container thì múi giờ thế nào? Container mặc định kế thừa UTC của host — đặt biến TZ=Asia/Ho_Chi_Minh trong Dockerfile hoặc compose file để dùng giờ Việt Nam. Vẫn nên dùng công cụ chuyển đổi múi giờ để xác nhận giờ UTC tương đương trước khi viết biểu thức.

Cron không gửi thông báo khi thất bại — xử lý thế nào? Thêm MAILTO=your@email.vn ở đầu crontab để nhận email khi job có output/lỗi, hoặc kết thúc script bằng webhook đến Telegram/Slack khi exit code khác 0.


BKNS Tools — bộ công cụ lập trình miễn phí cho developer Việt. Tạo cron · Kiểm tra cron · Unix Timestamp · Chuyển múi giờ — không cần đăng nhập.