CRON THAM KHẢO NHANH
Lập lịch job, cú pháp crontab, chuỗi đặc biệt, logging
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-59 | Phạm vi phút |
| 0-23 | Phạm vi giờ |
| 1-31 | Phạm vi ngày trong tháng |
| 1-12 | Phạm vi tháng (hoặc JAN-DEC) |
| 0-7 | Ngày trong tuần (0&7=CN, hoặc SUN-SAT) |
Chuỗi Đặc Biệt
Lịch Rút Gọn
| @reboot | Chạy một lần khi khởi động |
| @yearly | 0 0 1 1 * — mỗi năm một lần (1/1) |
| @monthly | 0 0 1 * * — mỗi tháng một lần (ngày 1) |
| @weekly | 0 0 * * 0 — mỗi tuần một lần (Chủ nhật) |
| @daily | 0 0 * * * — mỗi ngày một lần (nửa đêm) |
| @hourly | 0 * * * * — 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-5 | Cá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
| SHELL | Shell 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) |
| MAILTO | Gửi đầu ra đến địa chỉ này (rỗng = không gửi) |
| HOME | Thư 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 * * 1 | Mỗi thứ Hai lúc 6 giờ sáng |
| 0 0 1,15 * * | Ngày 1 và 15 hằng tháng |
| 0 0 * * 5 | Mỗ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/crontab | Crontab 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 đối | PATH của cron tối giản; luôn dùng đường dẫn đầy đủ |
| Chuyển hướng đầu ra | Tránh spam mail với > /dev/null 2>&1 |
| Lock files | Dùng flock để ngăn chạy chồng chéo |
| Kiểm tra trước | Chạ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 timezone | Cron 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