| 指令 | 功能 | 範例 |
crontab -e | 編輯當前使用者 crontab(進入 $EDITOR) | crontab -e |
crontab -l | 列出當前使用者 crontab | crontab -l |
crontab -r | 刪除當前使用者 crontab(慎用) | crontab -r |
crontab -u user -e | root 編輯指定使用者 crontab | crontab -u www -e |
crontab -u user -l | root 查看指定使用者 crontab | crontab -u www -l |
儲存位置
- 使用者表:
/var/spool/cron/username(或 /var/spool/cron/crontabs/username)
- 系統表:
/etc/crontab、/etc/cron.d/ 目錄下檔案
三、crontab 時間格式與特殊符號
* * * * * 執行命令
- - - - -
| | | └─ 星期 (0-7) (0 或 7 = 星期日)
| | └──── 月份 (1-12)
| └────── 日期 (1-31)
└──────── 小時 (0-23)
分鐘 (0-59)
特殊符號
| 符號 | 含義 | 範例 | 說明 |
* | 所有合法值 | * * * * * | 每分鐘 |
, | 列舉離散值 | 0 8,12,18 * * * | 每天 8:00、12:00、18:00 |
- | 範圍 | 0 9-17 * * 1-5 | 工作日 9-17 點整點 |
/ | 步長(每 N 個單位) | */10 * * * * | 每 10 分鐘 |
L | Last(最後一天/最後一個星期幾) | 0 0 L * * | 每月最後一天午夜 |
W | 最近工作日 | 0 0 15W * * | 每月 15 號最近工作日 |
# | 第 N 個星期幾 | 0 0 * * 1#2 | 每月第二個星期一 |
四、經典範例集
# 每天 06:00 問候
0 6 * * * echo "Good morning" >> /tmp/greeting.log
# 每 2 小時檢查磁碟
0 */2 * * * df -h >> /tmp/disk.log
# 晚上 23:00 到早上 07:00 每 2 小時,外加 08:00
0 23-7/2,8 * * * echo "Night watch" >> /tmp/night.log
# 每月 4 號及每週一至三 11:00
0 11 4 * 1-3 /usr/local/bin/monthly_weekly.sh
# 每年 1 月 1 日 04:00
0 4 1 1 * /usr/local/bin/yearly.sh
# 開機執行(@reboot 特殊關鍵字)
@reboot /usr/local/bin/startup_check.sh
# 每分鐘執行(壓測/監控)
* * * * * /usr/local/bin/health_check.sh
五、環境變數與執行上下文陷阱(最常見失敗原因)
| 差異 | 互動 Shell | cron 環境 | 對策 |
| PATH | /usr/local/bin:/usr/bin:... | /usr/bin:/bin | 腳本內 export PATH=... 或命令用絕對路徑 |
| SHELL | /bin/bash | /bin/sh | crontab 首行 SHELL=/bin/bash |
| HOME | /home/user | / (或 /root) | 腳本內 cd /absolute/path |
| 環境變數 | 完整繼承 | 極少 | 腳本開頭 source /etc/profile; source ~/.bashrc |
| 標準輸出/錯誤 | 終端顯示 | 郵件寄給擁有者 | 重導向 >/var/log/job.log 2>&1 |
最佳實踐模板
# /etc/cron.d/myapp 或 crontab -e 內容
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
MAILTO="admin@example.com" # 錯誤通知郵箱,空字串關閉郵件
# 每天 03:00 備份資料庫
0 3 * * * /usr/local/bin/backup_db.sh >>/var/log/backup_db.log 2>&1
六、系統級定時任務目錄
| 目錄 | 執行頻率 | 適用場景 |
/etc/cron.hourly/ | 每小時 | 輕量同步、清理 |
/etc/cron.daily/ | 每天(預設 06:25) | logrotate、備份、更新資料庫 |
/etc/cron.weekly/ | 每週(預設 週日 06:47) | 深度清理、報表生成 |
/etc/cron.monthly/ | 每月(預設 1 號 06:52) | 帳單、歸檔 |
將可執行腳本(chmod +x)放入對應目錄,由 run-parts 執行。/etc/crontab 定義具體時間。
七、故障排查清單
- 服務是否運行:
systemctl status cron
- 語法是否正確:
crontab -l 檢查、crontab -e 存檔時會語法檢查
- 命令是否可執行:手動在終端執行完整命令驗證
- 路徑/環境變數:腳本加
set -x; exec >>/tmp/debug.log 2>&1 觀察
- 權限:腳本擁有者需有執行權限,寫入目標目錄權限
- 日誌查看:
grep CRON /var/log/syslog(Debian)或 /var/log/cron(CentOS)
- 郵件通知:
mail 指令查看 root/使用者信箱
八、systemd Timer 現代替代(精度更高、日誌整合、依賴管理)
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily DB Backup
[Timer]
OnCalendar=daily 03:00
Persistent=true
RandomizedDelaySec=15m
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=DB Backup Script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_db.sh
systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers --all
九、總結
cron 簡單、普及、相容性極佳,仍是定時任務首選。關鍵在於環境變數顯式宣告、絕對路徑、輸出重導向、日誌監控四大鐵律。對於需要秒級精度、啟動順序依賴、資源限制的場景,請遷移至 systemd Timer。