crond 是 Linux 系統級排程服務,支援分鐘級精度的週期性任務自動執行。本文系統整理 crontab 寫法、六欄位時間語法、特殊符號、環境變數陷阱、郵件日誌靜默、系統級與用戶級任務區別、/etc/crontab 寫法與實戰範例。
分 時 日 月 週 命令。/etc/crontab (含使用者欄位)。/var/spool/cron/username (無使用者欄位)。| 欄位 | 範圍 | 特殊符號 | 範例 |
|---|---|---|---|
| 分 | 0-59 | *, ,, -, / | */10 每 10 分鐘 |
| 時 | 0-23 | 2-6 凌晨 2-6 點 | |
| 日 | 1-31 | 1,15 每月 1 號、15 號 | |
| 月 | 1-12 | 3,6,9,12 季末 | |
| 週 | 0-7 (0/7=週日) | 1-5 週一至週五 |
# 每 3 小時重啟 Apache
0 */3 * * * /usr/local/apache2/bin/apachectl restart
# 每週六 03:30 備份
30 3 * * 6 /webdata/bin/backup.sh
# 每月 1 號、20 號檢查磁碟
0 0 1,20 * * fsck /dev/sdb8
# 每月 5,10,15,20,25,30 號 05:10 清理 Apache 存取日誌
10 5 5,10,15,20,25,30 * * echo "" > /usr/local/apache2/logs/access_log
# 每分鐘測試 (除錯用)
* * * * * /path/to/test.sh
| 指令 | 說明 |
|---|---|
crontab -e | 編輯當前用戶任務表 |
crontab -l | 列出當前用戶任務表 |
crontab -r | 刪除當前用戶任務表 |
crontab -i | 刪除前確認 |
crontab -u user -e | Root 編輯指定用戶任務表 |
crontab file | 從檔案載入任務表 |
現象:手動執行腳本正常,cron 不執行。
原因:cron 不載入使用者 Shell 環境 (PATH、HOME、LD_LIBRARY_PATH 等)。
解決:在 crontab 開頭**顯式宣告所有必要環境變數**:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
HOME=/root
MAILTO="" # 空值不發郵件
LD_LIBRARY_PATH=/usr/local/lib
0 */3 * * * /usr/local/apache2/bin/apachectl restart
或在腳本內 source /etc/profile / source ~/.bash_profile。
每次任務輸出 (stdout/stderr) 皆寄信給擁有者。
解決:重導向至 /dev/null:
0 */3 * * * /usr/local/apache2/bin/apachectl restart >/dev/null 2>&1
# 2>&1 將 stderr 導向 stdout,stdout 已導向 /dev/null
/etc/crontab):含第 6 欄「使用者」,可指定 root 或其他用戶身份執行,**重啟系統任務必須寫這裡**。crontab -e):以該用戶身份執行,**無法執行需 root 權限的指令 (如 reboot)**。/etc/crontab 或 crontab -u root -e,但 reboot 僅在 /etc/crontab 生效。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 每小時執行 /etc/cron.hourly 腳本
01 * * * * root run-parts /etc/cron.hourly
# 每天 04:02 執行 daily
02 4 * * * root run-parts /etc/cron.daily
# 每週日 04:22 執行 weekly
22 4 * * 0 root run-parts /etc/cron.weekly
# 每月 1 號 04:42 執行 monthly
42 4 1 * * root run-parts /etc/cron.monthly
# 自訂系統任務:每天 02:00 重啟系統 (需寫在這裡)
0 2 * * * root /sbin/reboot
systemd 提供 .timer 單元,具備:
systemctl list-timers, journalctl -u unit。建議新專案優先使用 systemd Timers,舊有 crontab 可共存遷移。
