- Tác giả

- Name
- Nguyễn Đức Xinh
- Ngày xuất bản
- Ngày xuất bản
Crontab: Hướng Dẫn Toàn Tập Từ Cơ Bản Đến Nâng Cao
Crontab Là Gì?
Crontab (cron table) là một file cấu hình chứa danh sách các lệnh được lên lịch để chạy tự động tại các thời điểm cụ thể trên hệ thống Unix/Linux. Nó là công cụ mạnh mẽ cho system administrators và developers để tự động hóa các tác vụ lặp lại.
Cron là daemon (dịch vụ chạy nền) chịu trách nhiệm đọc các crontab file và thực thi các lệnh theo lịch đã định.
Lợi Ích Của Crontab
- ✅ Tự động hóa các tác vụ lặp lại
- ✅ Giảm thiểu lỗi do thao tác thủ công
- ✅ Chạy tasks vào thời điểm không tải cao
- ✅ Không cần can thiệp của người dùng
- ✅ Có sẵn trên hầu hết các hệ Unix/Linux
- ✅ Đơn giản và dễ sử dụng
Các Loại Crontab
- User Crontab: Crontab của từng user, lưu tại
/var/spool/cron/crontabs/username - System Crontab: Crontab hệ thống tại
/etc/crontab - Cron Directories: Các thư mục đặc biệt như
/etc/cron.daily,/etc/cron.hourly
Cú Pháp Cron Expression
Cấu Trúc Cơ Bản
Mỗi dòng trong crontab gồm 6 trường:
┌───────────── 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) (Chủ nhật = 0 hoặc 7)
│ │ │ │ │
│ │ │ │ │
* * * * * command to execute
Các Ký Tự Đặc Biệt
| Ký Tự | Ý Nghĩa | Ví Dụ |
|---|---|---|
* |
Bất kỳ giá trị nào | * * * * * = Mỗi phút |
, |
Danh sách các giá trị | 1,15,30 * * * * = Phút 1, 15, 30 |
- |
Khoảng giá trị | 0-5 * * * * = Từ phút 0 đến 5 |
/ |
Bước nhảy | */5 * * * * = Mỗi 5 phút |
L |
Ngày cuối cùng (Last) | Chỉ dùng trong một số version |
W |
Ngày làm việc gần nhất | Chỉ dùng trong một số version |
# |
Tuần thứ N trong tháng | Chỉ dùng trong một số version |
Các Ví Dụ Cron Expression Phổ Biến
| Expression | Mô Tả |
|---|---|
* * * * * |
Mỗi phút |
*/5 * * * * |
Mỗi 5 phút |
0 * * * * |
Mỗi giờ, vào phút 0 |
0 0 * * * |
Mỗi ngày lúc 00:00 (nửa đêm) |
0 2 * * * |
Mỗi ngày lúc 02:00 |
0 0 * * 0 |
Mỗi Chủ nhật lúc 00:00 |
0 0 1 * * |
Ngày đầu tiên của mỗi tháng lúc 00:00 |
0 0 1 1 * |
Ngày đầu năm (1/1) lúc 00:00 |
0 9-17 * * 1-5 |
Mỗi giờ từ 9h-17h, thứ 2-6 |
0 */4 * * * |
Mỗi 4 giờ |
0 0 */2 * * |
Mỗi 2 ngày lúc 00:00 |
0 0 * * 1,3,5 |
Thứ 2, 4, 6 lúc 00:00 |
30 2 15 * * |
Ngày 15 hàng tháng lúc 02:30 |
0 22 * * 1-5 |
Thứ 2-6 lúc 22:00 |
*/10 * * * * |
Mỗi 10 phút |
Ví Dụ Nâng Cao
# Chạy vào 2:30 AM mỗi ngày thứ Hai
30 2 * * 1 /path/to/script.sh
# Chạy mỗi 15 phút trong giờ làm việc (9-18h) các ngày trong tuần
*/15 9-18 * * 1-5 /usr/bin/process_data.py
# Chạy lúc 00:00 và 12:00 mỗi ngày
0 0,12 * * * /usr/local/bin/backup.sh
# Chạy vào 23:00 các ngày cuối tuần
0 23 * * 6,0 /home/user/cleanup.sh
# Chạy mỗi 30 phút từ 8:00 đến 17:30 các ngày trong tuần
0,30 8-17 * * 1-5 /usr/bin/check_status.sh
Các Lệnh Crontab Cơ Bản
1. Xem Crontab Hiện Tại
# Xem crontab của user hiện tại
crontab -l
# Xem crontab của user khác (cần quyền root)
sudo crontab -u username -l
2. Chỉnh Sửa Crontab
# Mở editor để chỉnh sửa crontab
crontab -e
# Chỉnh sửa crontab của user khác
sudo crontab -u username -e
Chọn editor:
# Thiết lập editor mặc định
export EDITOR=nano # hoặc vim, vi, etc.
export VISUAL=nano
# Hoặc
select-editor
3. Xóa Crontab
# Xóa toàn bộ crontab
crontab -r
# Xóa với prompt xác nhận
crontab -i -r
# Xóa crontab của user khác
sudo crontab -u username -r
4. Backup và Restore Crontab
# Backup crontab
crontab -l > ~/crontab_backup_$(date +%Y%m%d).txt
# Restore crontab
crontab ~/crontab_backup_20260211.txt
# Copy crontab từ file
crontab /path/to/crontab-file
Cấu Trúc File Crontab
User Crontab
# Định nghĩa biến môi trường
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@example.com
# Comment: Mô tả công việc
# m h dom mon dow command
30 2 * * * /home/user/backup.sh
0 */6 * * * /usr/bin/php /var/www/cron.php
*/5 * * * * /usr/local/bin/monitor.py
System Crontab (/etc/crontab)
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Lưu ý: System crontab có thêm trường user sau các trường thời gian.
Biến Môi Trường Trong Crontab
Các Biến Quan Trọng
# Shell sử dụng để chạy lệnh
SHELL=/bin/bash
# PATH cho các lệnh
PATH=/usr/local/bin:/usr/bin:/bin
# Email nhận output và error
MAILTO=admin@example.com
# Không gửi email (silence output)
MAILTO=""
# Timezone
CRON_TZ=America/New_York
# Home directory
HOME=/home/username
# Log level
CRON_LOGFILE=/var/log/cron.log
Ví Dụ Sử Dụng Biến
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin
MAILTO=sysadmin@example.com
HOME=/home/production
# Backup database mỗi ngày lúc 2 AM
0 2 * * * /home/production/scripts/backup_db.sh
# Clean logs mỗi tuần
0 3 * * 0 find /var/log/app -name "*.log" -mtime +7 -delete
# Health check mỗi 5 phút
*/5 * * * * curl -fsS --retry 3 https://hc-ping.com/your-uuid-here > /dev/null
Output và Error Handling
Redirect Output
# Redirect STDOUT và STDERR vào file
30 2 * * * /path/to/script.sh > /var/log/script.log 2>&1
# Append thay vì overwrite
30 2 * * * /path/to/script.sh >> /var/log/script.log 2>&1
# Chỉ lưu errors
30 2 * * * /path/to/script.sh > /dev/null 2>> /var/log/script_errors.log
# Bỏ qua toàn bộ output
30 2 * * * /path/to/script.sh > /dev/null 2>&1
# Redirect mỗi stream riêng biệt
30 2 * * * /path/to/script.sh 1>> /var/log/script_out.log 2>> /var/log/script_err.log
Ghi Log Chi Tiết
# Log với timestamp
* * * * * echo "$(date): Running backup" >> /var/log/cron_backup.log && /path/to/backup.sh >> /var/log/cron_backup.log 2>&1
# Sử dụng logger để ghi vào syslog
*/5 * * * * /path/to/script.sh 2>&1 | logger -t mycron
# Tạo log file với tên chứa datetime
0 2 * * * /path/to/script.sh > /var/log/backup_$(date +\%Y\%m\%d_\%H\%M\%S).log 2>&1
Email Notifications
# Gửi email khi có output
MAILTO=admin@example.com
0 2 * * * /path/to/backup.sh
# Không gửi email
MAILTO=""
0 2 * * * /path/to/backup.sh
# Gửi email chỉ khi có lỗi
0 2 * * * /path/to/backup.sh > /dev/null
Các Tác Vụ Thường Làm Với Crontab
1. Database Backup
# Backup MySQL database hàng ngày lúc 2 AM
0 2 * * * mysqldump -u root -p'password' database_name > /backup/db_$(date +\%Y\%m\%d).sql
# Backup và compress
0 2 * * * mysqldump -u root -p'password' database_name | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz
# Backup tất cả databases
0 2 * * * mysqldump -u root -p'password' --all-databases | gzip > /backup/all_db_$(date +\%Y\%m\%d).sql.gz
# Backup PostgreSQL
0 2 * * * pg_dump -U postgres database_name | gzip > /backup/pg_db_$(date +\%Y\%m\%d).sql.gz
2. Log Cleanup
# Xóa log files cũ hơn 7 ngày
0 3 * * * find /var/log/app -name "*.log" -mtime +7 -delete
# Xóa và compress logs
0 3 * * * find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
# Xóa backup cũ
0 4 * * 0 find /backup -name "*.sql" -mtime +30 -delete
# Clean temp files
0 */6 * * * find /tmp -type f -mtime +1 -delete
Debugging và Troubleshooting
1. Kiểm Tra Cron Service
# Kiểm tra status
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
# Start/Stop/Restart
sudo systemctl start cron
sudo systemctl restart cron
sudo systemctl enable cron # Auto-start on boot
# Kiểm tra cron daemon có chạy không
ps aux | grep cron
2. Xem Cron Logs
# Ubuntu/Debian
tail -f /var/log/syslog | grep CRON
grep CRON /var/log/syslog
# CentOS/RHEL
tail -f /var/log/cron
# Xem toàn bộ cron execution
journalctl -u cron.service -f
# Xem log của user cụ thể
grep "username" /var/log/syslog | grep CRON
3. Các Vấn Đề Thường Gặp
Vấn Đề 1: PATH không đúng
# ❌ Sai - Command không tìm thấy
0 2 * * * backup.sh
# ✅ Đúng - Dùng absolute path
0 2 * * * /usr/local/bin/backup.sh
# Hoặc set PATH
PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * backup.sh
Vấn Đề 2: Environment Variables
# ❌ Sai - Biến không được set
0 2 * * * echo $HOME
# ✅ Đúng - Source environment
0 2 * * * /bin/bash -c 'source ~/.bashrc && echo $HOME'
Vấn Đề 3: Permission Issues
# Kiểm tra permission
ls -la /path/to/script.sh
# Fix permission
chmod +x /path/to/script.sh
chmod 755 /path/to/script.sh
# Kiểm tra owner
chown user:group /path/to/script.sh
Vấn Đề 4: Special Characters
# ❌Sai - % cần escape
0 2 * * * /backup/db_$(date +%Y%m%d).sql
# ✅ Đúng - Escape %
0 2 * * * /backup/db_$(date +\%Y\%m\%d).sql
# Hoặc dùng script wrapper
0 2 * * * /usr/local/bin/backup_wrapper.sh
4. Enable Detailed Logging
# Trong /etc/default/cron hoặc /etc/sysconfig/crond
EXTRA_OPTS="-L 2" # 0=errors, 1=notice, 2=info, 3+=debug
# Reload cron
sudo systemctl restart cron
5. Manual Testing
# Chạy lệnh như cron sẽ chạy
sudo -u username /bin/bash -c 'source ~/.cronenv && /path/to/script.sh'
# Test với môi trường giống cron
env -i HOME=/home/username /bin/bash -c '/path/to/script.sh'
# Check có output/error không
/path/to/script.sh > /tmp/test_output.log 2>&1
cat /tmp/test_output.log
Best Practices
1. Luôn Log Output
# Good: Có log để debug
0 2 * * * /path/to/script.sh >> /var/log/script.log 2>&1
# Better: Log với timestamp
0 2 * * * (echo "=== $(date) ==="; /path/to/script.sh) >> /var/log/script.log 2>&1
2. Sử Dụng Locking
# Ngăn multiple instances
* * * * * flock -n /var/lock/myscript.lock /path/to/script.sh
3. Set MAILTO
# Để nhận notification
MAILTO=admin@example.com
# Hoặc disable email
MAILTO=""
4. Comment Code
# Backup MySQL database daily at 2 AM
# Output: /backup/db_YYYYMMDD.sql.gz
# Alert: admin@example.com if failed
0 2 * * * /usr/local/bin/db_backup.sh >> /var/log/backup.log 2>&1
5. Test Trước Khi Deploy
# Test syntax
crontab -l > /tmp/test_cron
# Edit và test
crontab /tmp/test_cron
6. Backup Crontab
# Regular backup
0 0 * * 0 crontab -l > ~/crontab_backup_$(date +\%Y\%m\%d).txt
7. Cleanup Old Files
# Cleanup logs và backups
0 3 * * * find /var/log/app -name "*.log" -mtime +30 -delete
0 4 * * * find /backup -name "*.sql.gz" -mtime +60 -delete
8. Monitoring
# Use external monitoring
0 2 * * * /path/to/backup.sh && curl https://monitoring.service/ping
9. Resource Management
# Limit CPU usage
0 2 * * * nice -n 19 /path/to/heavy_script.sh
# Limit memory
0 2 * * * ulimit -v 1000000 && /path/to/script.sh
# IO priority
0 2 * * * ionice -c3 /path/to/io_intensive_script.sh
10. Version Control
# Lưu crontab vào git
crontab -l > ~/dotfiles/crontab
cd ~/dotfiles && git add crontab && git commit -m "Update crontab"
Tools Hỗ Trợ
1. Crontab Generator
- Crontab.guru - Interactive cron schedule expression editor
- Crontab Generator - Generate crontab syntax
2. Monitoring Services
- Cronitor - Cron job monitoring
- Healthchecks.io - Free cron monitoring
- Dead Man's Snitch - Monitoring service
3. Management Tools
# crontab-ui - Web interface cho crontab
npm install -g crontab-ui
crontab-ui
# Whenever - Ruby gem để generate crontab
gem install whenever
Tài Nguyên Bổ Sung
- Man Page: cron
- Man Page: crontab
- Crontab.guru - Cron expression helper
- Cronitor Guide
Kết Luận
Crontab là công cụ mạnh mẽ và không thể thiếu cho việc tự động hóa tasks trên Linux/Unix. Với kiến thức từ cơ bản đến nâng cao trong bài viết này, bạn có thể:
- ✅ Tạo và quản lý cron jobs hiệu quả
- ✅ Debug và troubleshoot các vấn đề thường gặp
- ✅ Implement best practices cho production
- ✅ Tự động hóa các tác vụ phức tạp
- ✅ Monitor và maintain cron jobs
Hãy bắt đầu với các task đơn giản, test kỹ càng, và dần dần áp dụng các kỹ thuật nâng cao khi cần thiết. Luôn nhớ log output, handle errors, và monitor jobs của bạn để đảm bảo hệ thống chạy ổn định!
