cron 是 Linux 系統級任務排程服務,支援分鐘級精度的週期性任務自動化。本文詳細說明 crontab 指令、語法格式、特殊符號、系統級與用戶級配置差異、常見範例與故障排查。
1. crontab 指令選項
| 選項 | 功能 |
| -u user | 指定用戶 (需 root) |
| -l | 列出當前用戶任務 |
| -r | 刪除當前用戶所有任務 |
| -e | 編輯任務 (啟動編輯器) |
2. 時間欄位語法
* * * * * command
分 時 日 月 週 命令
| 欄位 | 範圍 | 說明 |
| Minute | 0-59 | 每小時第幾分鐘 |
| Hour | 0-23 | 每天第幾小時 |
| Day | 1-31 | 每月第幾天 |
| Month | 1-12 | 每年第幾月 |
| Week | 0-7 | 每週第幾天 (0/7=週日) |
未指定欄位用 * 佔位。
3. 特殊符號
| 符號 | 含義 | 範例 |
| * | 所有可能值 | * * * * * 每分鐘 |
| , | 離散列舉 | 10,20,30 * * * * 第 10/20/30 分鐘 |
| - | 連續範圍 | 8-11 * * * * 8-11 點每分鐘 |
| / | 步進/間隔 | */15 * * * * 每 15 分鐘 |
4. 配置檔案層級差異
| 層級 | 檔案位置 | 編輯方式 | 執行身份 | 適用場景 |
| 用戶級 | /var/spool/cron/username | crontab -e | 該用戶 | 個人腳本、備份 |
| 系統級 | /etc/crontab | vim 直接編輯 | 指定用戶欄位 | 系統維護、日誌輪轉 |
| 系統級 | /etc/cron.d/ | 建立檔案 | 指定用戶欄位 | 套件安裝任務 |
| 週期目錄 | /etc/cron.hourly/daily/weekly/monthly | 放入可執行腳本 | run-parts 執行 | 簡單週期任務 |
/etc/crontab 格式 (含用戶欄位)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 範例
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
5. 常見範例速查
5 * * * * /usr/bin/ls # 每小時第 5 分鐘
30 5 * * * /backup/script.sh # 每天 05:30
30 7 8 * * /backup/script.sh # 每月 8 號 07:30
30 5 8 6 * /backup/script.sh # 每年 6 月 8 日 05:30
30 6 * * 0 /backup/script.sh # 每週日 06:30
30 3 10,20 * * /backup/script.sh # 每月 10、20 號 03:30
25 8-11 * * * /backup/script.sh # 每天 08-11 點第 25 分鐘
*/15 * * * * /backup/script.sh # 每 15 分鐘
30 6 */10 * * /backup/script.sh # 每月 1、11、21、31 號 06:30
50 7 * * * root run-parts /etc/cron.daily # 每天 07:50 以 root 執行 daily 目錄腳本
10,20,30 * * * * echo "log" >> /tmp/cron.log
0 */2 * * * user /usr/bin/cmd >> /dev/null 2>&1
6. 服務管理與故障排查
# 服務控制
systemctl start|stop|restart|status crond
# 或舊版
service crond start|stop|restart|status
/etc/init.d/crond restart
# 查看執行日誌
grep CRON /var/log/cron
tail -f /var/log/cron
# 常見問題
# 1. 腳本無執行權限 → chmod +x script.sh
# 2. 環境變數缺失 → 腳本內完整路徑 /usr/bin/... 或 source /etc/profile
# 3. 輸出未重導向 → 產生郵件堆積,加 >> /var/log/mycron.log 2>&1
# 4. 時間格式錯誤 → crontab -l 檢查
# 5. cron 服務未啟動 → systemctl enable --now crond
7. 一鍵部署範例腳本
#!/bin/bash
# deploy_cron.sh
cat > /etc/cron.d/myapp <<'EOF'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 每天 02:00 備份資料庫
0 2 * * * postgres /usr/local/bin/pg_backup.sh >> /var/log/pg_backup.log 2>&1
# 每小時清理暫存
0 * * * * root find /tmp/myapp -type f -mtime +1 -delete
EOF
systemctl reload crond