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ường | Khoảng | Mô Tả |
---|---|---|
Phút | 0-59 | Phút nào trong giờ |
Giờ | 0-23 | Giờ nào trong ngày (định dạng 24 giờ) |
Ngày trong Tháng | 1-31 | Ngày nào trong tháng |
Tháng | 1-12 | Tháng nào trong năm (hoặc JAN-DEC) |
Ngày trong Tuần | 0-6 | Ngà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ối1,15
trong trường ngày = ngày 1 và 15 của thángMON,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ối1-5
trong trường ngày trong tuần = Thứ hai đến Thứ sáuJAN-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út0-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ĩa | Tương Đương |
---|---|---|
@yearly hoặc @annually | Chạy một lần một năm | 0 0 1 1 * |
@monthly | Chạy một lần một tháng | 0 0 1 * * |
@weekly | Chạy một lần một tuần | 0 0 * * 0 |
@daily hoặc @midnight | Chạy một lần một ngày | 0 0 * * * |
@hourly | Chạy một lần một giờ | 0 * * * * |
@reboot | Chạy khi khởi động | N/A |
Ví Dụ Biểu Thức Cron Phổ Biến
Thời Gian Cơ Bản
Biểu Thức | Mô 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 * * 0 | Mỗ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ức | Mô Tả |
---|---|
30 2 * * * | Mỗi ngày lúc 2:30 sáng |
0 9 * * 1-5 | Mỗi ngày trong tuần lúc 9:00 sáng |
0 22 * * 1-5 | Mỗ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ức | Mô 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-5 | Mỗ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ức | Mô 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 * 3 | Lú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ức | Mô Tả | Trường Hợp Sử Dụng |
---|---|---|
0 2 * * * | Hàng ngày lúc 2:00 sáng | Sao lưu cơ sở dữ liệu |
0 0 * * 0 | Hàng tuần vào Chủ nhật lúc nửa đêm | Báo cáo tuần |
*/15 * * * * | Mỗi 15 phút | Kiể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 đêm | Thanh toán tháng |
0 9 * * 1 | Mỗi Thứ hai lúc 9:00 sáng | Họp nhóm hàng tuần |
0 */6 * * * | Mỗi 6 giờ | Xoay vòng log |
30 2 * * 1-5 | Các ngày trong tuần lúc 2:30 sáng | Bả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
Kiểm Tra Dòng Lệnh
# 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
# 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
# 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
# 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:
# Đ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
# 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:
0 0,12 1 */2 *
- ?0 4 8-14 * *
- ?0 0 1,15 * 3
- ?5 0 * 8 *
- ?15 14 1 * *
- ?*/10 9-17 * * 1-5
- ?0 2 * * 1,3,5
- ?30 */3 * * *
- ?
Đáp Án:
- Lúc nửa đêm và trưa vào ngày 1 của mỗi 2 tháng
- Lúc 4:00 sáng vào mỗi ngày từ 8 đến 14 của mỗi tháng
- Lúc nửa đêm vào ngày 1 và 15 của mỗi tháng, và mỗi Thứ tư
- Lúc 12:05 sáng mỗi ngày trong tháng 8
- Lúc 2:15 chiều vào ngày 1 của mỗi tháng
- Mỗi 10 phút từ 9 giờ sáng đến 5 giờ chiều, Thứ hai đến Thứ sáu
- Lúc 2:00 sáng vào Thứ hai, Thứ tư và Thứ sáu
- 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
sudo systemctl status cron
# hoặc
sudo service cron status
Xem Log Cron
# 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
- Vấn Đề Đường Dẫn: Luôn sử dụng đường dẫn tuyệt đối
- Biến Môi Trường: Cron có môi trường tối thiểu
- Quyền: Đảm bảo người dùng có thể thực thi lệnh
- 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ả!