Skip to content

Hướng dẫn Cron Job & biểu thức Cron ​

Cron Job là gì? ​

Cron là trình lập lịch công việc trên các hệ điều hành họ Unix (như Linux). Mỗi công việc được cron chạy tự động gọi là một cron job. Cron giúp bạn lên lịch cho lệnh hoặc script chạy định kỳ vào thời điểm, ngày tháng hoặc khoảng thời gian cố định.

Trên FlashPanel, bạn tạo cron job cho máy chủ tại trang Lập lịch CronJob. Trang này giúp bạn hiểu cách viết biểu thức cron.

Ưu điểm khi sử dụng Cron Job ​

Một trong những nỗi khổ của quản trị viên hệ thống là phải xử lý công việc cả ngày lẫn đêm. Một số tác vụ cần chạy xuyên đêm hoặc vào cuối tuần. Chẳng lẽ ta phải bỏ thời gian rảnh mỗi tối để chạy lệnh, script ngoài giờ, hay thức đêm để chạy sao lưu và cập nhật?

Nhờ Cron Job, bạn tiết kiệm được rất nhiều thời gian khi lên lịch cho các tác vụ lặp lại, không cần phải ghi nhớ và chạy thủ công các công việc định kỳ.

Hạn chế khi sử dụng Cron Job ​

Cron Job chỉ có thể chạy lệnh theo chu kỳ từ 1 phút trở lên. Nếu muốn chạy công việc lặp lại với chu kỳ ngắn hơn 1 phút, cron không đáp ứng được.

Thành phần của Cron Job ​

Một cron job bao gồm hai thành phần chính:

  • Biểu Thức Cron: Chỉ ra chu kỳ lặp lại công việc
  • Lệnh: Lệnh sẽ được thực thi

Hiểu về biểu thức Cron ​

Ví dụ, trong dòng cron job dưới đây, * * * * * là biểu thức Cron (chạy mỗi phút), phần còn lại là lệnh:

* * * * * php /home/user/example.com/artisan schedule:run

Cấu trúc cơ bản ​

Một biểu thức cron bao gồm 5 trường được phân cách bởi dấu cách:

┌─────────────── phút (0 - 59)
│ ┌─────────────── giờ (0 - 23)
│ │ ┌─────────────── ngày trong tháng (1 - 31)
│ │ │ ┌─────────────── tháng (1 - 12)
│ │ │ │ ┌─────────────── ngày trong tuần (0 - 6) (Chủ nhật đến Thứ bảy)
│ │ │ │ │
│ │ │ │ │
* * * * *

Giá trị và khoảng của từng trường ​

TrườngKhoảngMô tả
Phút0-59Phút nào trong giờ
Giờ0-23Giờ nào trong ngày (định dạng 24 giờ)
Ngày trong tháng1-31Ngày nào trong tháng
Tháng1-12Tháng nào trong năm (hoặc JAN-DEC)
Ngày trong tuần0-6Ngày nào trong tuần (0=Chủ nhật, hoặc SUN-SAT)

Ký tự đặc biệt ​

Dấu sao (*) ​

  • Ý nghĩa: Tất cả giá trị trong khoảng cho phép
  • Ví dụ:
    • * trong trường phút = mỗi phút
    • * trong trường giờ = mỗi giờ
    • * trong trường ngày = mỗi ngày

Dấu phẩy (,) ​

  • Ý nghĩa: Phân cách danh sách cho nhiều giá trị
  • Ví dụ:
    • 7,19 trong trường giờ = 7 giờ sáng và 7 giờ tối
    • 1,15 trong trường ngày = ngày 1 và 15 của tháng
    • MON,WED,FRI trong trường ngày trong tuần = Thứ hai, Thứ tư, Thứ sáu

Dấu gạch ngang (-) ​

  • Ý nghĩa: Khoảng giá trị
  • Ví dụ:
    • 7-19 trong trường giờ = từ 7 giờ sáng đến 7 giờ tối
    • 1-5 trong trường ngày trong tuần = Thứ hai đến Thứ sáu
    • JAN-MAR trong trường tháng = Tháng 1 đến Tháng 3

Dấu gạch chéo (/) ​

  • Ý nghĩa: Giá trị bước (khoảng cách)
  • Ví dụ:
    • */5 trong trường phút = mỗi 5 phút
    • 0-20/2 trong trường giờ = mỗi 2 giờ từ 0 giờ đến 20 giờ
    • */3 trong trường tháng = mỗi 3 tháng

Dấu hỏi (?) ​

  • Ý nghĩa: Không có giá trị cụ thể (dùng trong trường ngày trong tháng hoặc ngày trong tuần)
  • Lưu ý: Ký tự này chỉ có trong một số trình lập lịch khác (như Quartz). Cron trên Linux không hỗ trợ ?; hãy dùng * thay thế.

Tên tháng và ngày ​

Bạn có thể sử dụng tên thay vì số:

Tháng: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC

Ngày: SUN, MON, TUE, WED, THU, FRI, SAT

Chuỗi đặc biệt ​

Thay vì năm trường, bạn có thể sử dụng các chuỗi đặc biệt này:

ChuỗiÝ nghĩaTương đương
@yearly hoặc @annuallyChạy một lần một năm0 0 1 1 *
@monthlyChạy một lần một tháng0 0 1 * *
@weeklyChạy một lần một tuần0 0 * * 0
@daily hoặc @midnightChạy một lần một ngày0 0 * * *
@hourlyChạy một lần một giờ0 * * * *
@rebootChạy khi khởi độngN/A

Ví dụ biểu thức Cron phổ biến ​

Thời gian cơ bản ​

Biểu ThứcMô Tả
* * * * *Mỗi phút
0 * * * *Mỗi giờ (tại phút 0)
0 0 * * *Mỗi ngày lúc nửa đêm
0 0 * * 0Mỗi Chủ nhật lúc nửa đêm
0 0 1 * *Ngày đầu tiên của mỗi tháng lúc nửa đêm
0 0 1 1 *Mỗi ngày 1 tháng 1 lúc nửa đêm

Thời gian cụ thể ​

Biểu ThứcMô Tả
30 2 * * *Mỗi ngày lúc 2:30 sáng
0 9 * * 1-5Thứ hai đến Thứ sáu lúc 9:00 sáng
0 22 * * 1-5Thứ hai đến Thứ sáu lúc 10:00 tối
0 0,12 * * *Mỗi ngày lúc nửa đêm và trưa
15 2,6,10,14,18,22 * * *Mỗi ngày lúc 2:15, 6:15, 10:15, 14:15, 18:15, 22:15

Khoảng thời gian ​

Biểu ThứcMô Tả
*/5 * * * *Mỗi 5 phút
0 */2 * * *Mỗi 2 giờ
0 0 */3 * *Mỗi 3 ngày
0 0 1 */2 *Mỗi 2 tháng vào ngày 1
0 9-17 * * 1-5Mỗi giờ từ 9 giờ sáng đến 5 giờ chiều, Thứ hai đến Thứ sáu

Ví dụ nâng cao ​

Biểu ThứcMô Tả
23 0-20/2 * * *Lúc 23 phút của mỗi 2 giờ từ nửa đêm đến 8 giờ tối
0 4 8-14 * *Lúc 4:00 sáng vào mỗi ngày từ 8 đến 14 trong tháng
0 0 1,15 * 3Lúc nửa đêm vào ngày 1 và 15 của mỗi tháng, và mỗi Thứ tư
5 0 * 8 *Lúc 0:05 mỗi ngày trong tháng 8
15 14 1 * *Lúc 2:15 chiều vào ngày đầu tiên của mỗi tháng

Các trường hợp sử dụng thực tế ​

Biểu thứcMô tảTrường hợp sử dụng
0 2 * * *Hàng ngày lúc 2:00 sángSao lưu cơ sở dữ liệu
0 0 * * 0Hàng tuần vào Chủ nhật lúc nửa đêmBáo cáo tuần
*/15 * * * *Mỗi 15 phútKiểm tra sức khỏe hệ thống
0 0 1 * *Hàng tháng vào ngày 1 lúc nửa đêmThanh toán tháng
0 9 * * 1Mỗi Thứ hai lúc 9:00 sángHọp nhóm hàng tuần
0 */6 * * *Mỗi 6 giờXoay vòng log
30 2 * * 1-5Thứ hai đến Thứ sáu lúc 2:30 sángBảo trì ngày làm việc

Kiểm tra biểu thức Cron ​

Công cụ trực tuyến ​

  • Crontab Guru - Công cụ xác thực biểu thức cron đơn giản
  • Cron Expression Generator - Lưu ý: công cụ này tạo biểu thức theo chuẩn Quartz (6-7 trường), cần bỏ trường giây và năm trước khi dùng cho cron trên Linux

Kiểm tra bằng dòng lệnh ​

bash
# Liệt kê crontab hiện tại của người dùng
crontab -l

# Chỉnh sửa crontab (cron sẽ báo lỗi nếu cú pháp không hợp lệ khi lưu)
crontab -e

WARNING

Không dùng lệnh echo "..." | crontab - để thử cú pháp: lệnh này sẽ ghi đè toàn bộ crontab hiện tại của người dùng.

Thực hành tốt nhất ​

1. Chọn thời gian cụ thể ​

bash
# Tốt: Thời gian cụ thể
0 3 * * * /backup.sh

# Tránh: Quá thường xuyên không có mục đích
* * * * * /script.sh

2. Sử dụng đường dẫn tuyệt đối ​

bash
# Tốt
0 2 * * * /usr/bin/php /var/www/app/backup.php

# Xấu
0 2 * * * php backup.php

3. Xử lý đầu ra đúng cách ​

bash
# Chuyển hướng đầu ra để tránh spam email
0 2 * * * /backup.sh > /var/log/backup.log 2>&1

# Bỏ đầu ra thông thường, chỉ giữ lại thông báo lỗi
0 2 * * * /backup.sh > /dev/null

4. Cân nhắc tải máy chủ ​

  • Tránh lên lịch tất cả công việc cùng một lúc (ví dụ: tất cả lúc nửa đêm)
  • Phân tán các công việc tương tự qua các thời gian khác nhau
  • Sử dụng độ trễ ngẫu nhiên cho hệ thống phân tán

Những lỗi phổ biến ​

1. Ngày trong tháng và ngày trong tuần ​

Khi cả ngày trong tháng và ngày trong tuần đều được chỉ định (không phải *), công việc sẽ chạy khi MỘT TRONG HAI điều kiện được đáp ứng:

bash
# Điều này chạy vào ngày 15 của mỗi tháng VÀ mỗi Thứ sáu
0 0 15 * 5

# Để chỉ chạy vào Thứ sáu ngày 15, dùng:
0 0 15 * * [ $(date +\%u) -eq 5 ] && /script.sh

2. Ranh giới tháng ​

bash
# Cẩn thận với ngày 31 - không tồn tại trong tất cả các tháng
0 0 31 * * /script.sh  # Sẽ không chạy trong tháng 2, 4, 6, v.v.

3. Lưu ý múi giờ ​

  • Cron chạy theo múi giờ của hệ thống
  • Lưu ý thay đổi giờ mùa hè (nếu múi giờ có áp dụng)
  • Ghi chú rõ múi giờ bạn dùng khi lên lịch

Bài tập thực hành ​

Hãy thử tìm hiểu ý nghĩa của những biểu thức này:

  1. 0 0,12 1 */2 * - ?
  2. 0 4 8-14 * * - ?
  3. 0 0 1,15 * 3 - ?
  4. 5 0 * 8 * - ?
  5. 15 14 1 * * - ?
  6. */10 9-17 * * 1-5 - ?
  7. 0 2 * * 1,3,5 - ?
  8. 30 */3 * * * - ?

Đáp án: ​

  1. Lúc nửa đêm và trưa vào ngày 1 của mỗi 2 tháng
  2. Lúc 4:00 sáng vào mỗi ngày từ 8 đến 14 của mỗi tháng
  3. Lúc nửa đêm vào ngày 1 và 15 của mỗi tháng, và mỗi Thứ tư
  4. Lúc 0:05 mỗi ngày trong tháng 8
  5. Lúc 2:15 chiều vào ngày 1 của mỗi tháng
  6. Mỗi 10 phút từ 9 giờ sáng đến 5 giờ chiều, Thứ hai đến Thứ sáu
  7. Lúc 2:00 sáng vào Thứ hai, Thứ tư và Thứ sáu
  8. Lúc 30 phút của mỗi 3 giờ

Khắc phục sự cố Cron Job ​

Kiểm tra cron có đang chạy không ​

bash
sudo systemctl status cron
# hoặc
sudo service cron status

Xem log cron ​

bash
sudo grep -i cron /var/log/syslog
# hoặc
sudo journalctl -u cron

Vấn đề phổ biến ​

  1. Đường dẫn: Luôn sử dụng đường dẫn tuyệt đối
  2. Biến môi trường: Cron chạy với rất ít biến môi trường, hãy khai báo đầy đủ biến cần thiết
  3. Quyền: Đảm bảo người dùng chạy cron có quyền thực thi lệnh
  4. Đầu ra: Chuyển hướng đầu ra vào file log để dễ kiểm tra lỗi

Với cron job tạo trong FlashPanel, bấm Xem Log để xem kết quả các lần chạy. Xem thêm Khắc phục sự cố CronJob.