Cú Pháp
Định Dạng Crontab
# ┌───── phút (0-59) # │ ┌───── giờ (0-23) # │ │ ┌───── ngày trong tháng (1-31) # │ │ │ ┌───── tháng (1-12) # │ │ │ │ ┌───── ngày trong tuần (0-7, 0&7=CN) # * * * * * lệnh
Giá Trị Trường
*Bất kỳ giá trị nào (wildcard)
,Danh sách giá trị: 1,3,5
-Phạm vi: 1-5
/Bước: */10 (mỗi 10 đơn vị)
0-59Phạm vi phút
0-23Phạm vi giờ
1-31Phạm vi ngày trong tháng
1-12Phạm vi tháng (hoặc JAN-DEC)
0-7Ngày trong tuần (0&7=CN, hoặc SUN-SAT)
Chuỗi Đặc Biệt
Lịch Rút Gọn
@rebootChạy một lần khi khởi động
@yearly0 0 1 1 * — mỗi năm một lần (1/1)
@monthly0 0 1 * * — mỗi tháng một lần (ngày 1)
@weekly0 0 * * 0 — mỗi tuần một lần (Chủ nhật)
@daily0 0 * * * — mỗi ngày một lần (nửa đêm)
@hourly0 * * * * — mỗi giờ một lần
Ví Dụ
Lịch Thường Dùng
30 2 * * * /usr/local/bin/backup.sh 0 9 * * 1-5 /opt/report.sh */15 * * * * /usr/bin/health-check.sh 0 0 1 * * /opt/monthly-cleanup.sh 0 8,17 * * * /opt/notify.sh
Giải Thích Lịch
30 2 * * *Hằng ngày lúc 2:30 sáng
0 9 * * 1-5Các ngày thường lúc 9:00 sáng
*/15 * * * *Mỗi 15 phút
0 0 1 * *Ngày đầu tháng, nửa đêm
0 8,17 * * *Hằng ngày lúc 8 giờ sáng và 5 giờ chiều
Môi Trường
Đặt Biến
SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin [email protected] HOME=/home/deploy * * * * * /opt/myjob.sh
Ghi Chú Môi Trường
SHELLShell chạy lệnh (mặc định /bin/sh)
PATHĐường dẫn tìm kiếm (mặc định cron rất tối giản)
MAILTOGửi đầu ra đến địa chỉ này (rỗng = không gửi)
HOMEThư mục home cho cron job
Logging
Đầu Ra & Logging
# chuyển hướng stdout + stderr vào file log */5 * * * * /opt/job.sh >> /var/log/job.log 2>&1 # bỏ qua tất cả đầu ra 0 3 * * * /opt/job.sh > /dev/null 2>&1 # chỉ log lỗi 0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
Xem Log Cron
# Debian / Ubuntu (syslog) grep CRON /var/log/syslog # RHEL / CentOS cat /var/log/cron # journalctl (systemd) journalctl -u cron --since "1 hour ago"
Lịch Thường Dùng
Pattern Hằng Ngày
0 * * * *Mỗi giờ đúng giờ
*/5 * * * *Mỗi 5 phút
*/30 * * * *Mỗi 30 phút
0 0 * * *Hằng ngày lúc nửa đêm
0 6 * * 1Mỗi thứ Hai lúc 6 giờ sáng
0 0 1,15 * *Ngày 1 và 15 hằng tháng
0 0 * * 5Mỗi thứ Sáu lúc nửa đêm
0 0 1 1 *Mỗi ngày 1 tháng 1
Lệnh crontab
Quản Lý Crontab
crontab -e # chỉnh sửa crontab của bạn crontab -l # liệt kê crontab của bạn crontab -r # xóa crontab của bạn crontab -u alice -l # liệt kê crontab của người dùng khác (root) crontab /path/to/file # cài crontab từ file
Vị Trí Crontab Hệ Thống
/etc/crontabCrontab toàn hệ thống (có trường user)
/etc/cron.d/File cron drop-in
/etc/cron.daily/Script chạy hằng ngày
/etc/cron.hourly/Script chạy hằng giờ
/etc/cron.weekly/Script chạy hằng tuần
/etc/cron.monthly/Script chạy hằng tháng
/var/spool/cron/Lưu trữ crontab theo từng người dùng
Mẹo
Best Practices
Dùng đường dẫn tuyệt đốiPATH của cron tối giản; luôn dùng đường dẫn đầy đủ
Chuyển hướng đầu raTránh spam mail với > /dev/null 2>&1
Lock filesDùng flock để ngăn chạy chồng chéo
Kiểm tra trướcChạy lệnh thủ công trước khi lên lịch
Dùng MAILTOĐặt MAILTO="" để tắt tất cả email
Kiểm tra timezoneCron dùng giờ hệ thống; xác minh bằng date
Ngăn Chồng Chéo với flock
# chỉ chạy nếu chưa đang chạy * * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh