Tiếng Việt
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:runCấ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ườ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,19trong trường giờ = 7 giờ sáng và 7 giờ tối1,15trong trường ngày = ngày 1 và 15 của thángMON,WED,FRItrong 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-19trong trường giờ = từ 7 giờ sáng đến 7 giờ tối1-5trong trường ngày trong tuần = Thứ hai đến Thứ sáuJAN-MARtrong 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ụ:
*/5trong trường phút = mỗi 5 phút0-20/2trong trường giờ = mỗi 2 giờ từ 0 giờ đến 20 giờ*/3trong 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ĩ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 | Thứ hai đến Thứ sáu lúc 9:00 sáng |
0 22 * * 1-5 | Thứ 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ứ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 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ứ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 | Thứ hai đến Thứ sáu 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 - 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 -eWARNING
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.sh2. 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.php3. 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/null4. 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.sh2. 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:
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 0:05 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 Job
Kiểm tra cron có đang chạy không
bash
sudo systemctl status cron
# hoặc
sudo service cron statusXem log cron
bash
sudo grep -i cron /var/log/syslog
# hoặc
sudo journalctl -u cronVấn đề phổ biến
- Đường dẫn: Luôn sử dụng đường dẫn tuyệt đối
- 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
- Quyền: Đảm bảo người dùng chạy cron có quyền thực thi lệnh
- Đầ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.