Skip to content

Hướng Dẫn Cron Job & Biểu Thức Cron

Cron Job là gì?

Tiện ích dòng lệnh cron, còn được gọi là cron job, là một bộ lập lịch công việc trên các hệ điều hành giống Unix. Người dùng thiết lập và duy trì môi trường phần mềm sử dụng cron để lên lịch công việc chạy định kỳ vào những thời điểm, ngày tháng hoặc khoảng thời gian cố định.

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

Một trong những nổi khổ của các sysadmin chắc hẳn là việc phải làm task cả ngày lẫn đêm. Một số task cần phải thực hiện xuyên đêm, hay phải làm vào những ngày cuối tuần. Thế ta phải bỏ thời gian rảnh rỗi mỗi tối để chạy các lệnh, script ngoài giờ sao? Hay lúc nào cũng phải thức đêm để chạy các bản backup hay cập nhật?

Nhờ Cron Job, bạn sẽ tiết kiệm được lượng lớn thời gian khi lên lịch thực hiện task lặp lại nhiều lần, không cần phải cố gắng ghi nhớ và tạo đi tạo lại những công việc định kì.

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

Cron Jobs chỉ có thể thực hiện câu lệnh theo chu kỳ 1 phút trở lên, trong trường hợp muốn thực hiện các công việc lặp lại theo chu kỳ thấp hơn 1 phút sẽ không làm được.

Thành Phần 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

Như ở hình trên các bạn thấy, * * * * * chính là biểu thức Cron.

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ị Trường và Khoả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 ngày trong tháng hoặc ngày trong tuần)
  • Sử dụng: Khi bạn muốn kích hoạt theo một điều kiện nhưng không theo điều kiện kia

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-5Mỗi ngày trong tuần lúc 9:00 sáng
0 22 * * 1-5Mỗi ngày trong tuần 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 12:05 sáng 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-5Các ngày trong tuần 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

Kiểm Tra Dòng Lệnh

bash
# Kiểm tra xem cú pháp cron có hợp lệ không
echo "0 2 * * * /path/to/script.sh" | crontab -

# Liệt kê crontab hiện tại
crontab -l

# Chỉnh sửa crontab
crontab -e

Thực Hành Tốt Nhất

1. Cụ Thể Về Thời Gian

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

# Chỉ gửi lỗi qua email
0 2 * * * /backup.sh > /dev/null

4. Xem Xét 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 so với 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 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ạy chỉ vào Thứ sáu ngày 15, sử 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. Xem Xét Múi Giờ

  • Cron chạy trong múi giờ hệ thống
  • Xem xét thay đổi giờ mùa hè
  • Ghi chép các giả định về múi giờ

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 12:05 sáng 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 Jobs

Kiểm Tra Xem Cron Có Đang Chạy

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

Xem Log Cron

bash
# Trên hầu hết các hệ thống
sudo tail -f /var/log/cron

# Trên Ubuntu/Debian
sudo tail -f /var/log/syslog | grep cron

Vấn Đề Phổ Biến

  1. Vấn Đề Đường Dẫn: Luôn sử dụng đường dẫn tuyệt đối
  2. Biến Môi Trường: Cron có môi trường tối thiểu
  3. Quyền: Đảm bảo người dùng có thể thực thi lệnh
  4. Xử Lý Đầu Ra: Chuyển hướng đầu ra để tránh vấn đề

Hướng dẫn toàn diện này sẽ giúp bạn thành thạo biểu thức cron và tạo các tác vụ được lên lịch hiệu quả!