cron 是 Linux 系統級排程服務,crontab 為使用者管理定時任務的介面。本文涵蓋 語法詳解、實戰範例、環境變數陷阱、日誌追蹤、systemd timer 現代替代方案。
| 指令 | 功能 |
|---|---|
crontab -e | 編輯當前使用者任務 (建立專屬編輯器) |
crontab -l | 列出當前任務 |
crontab -r | 移除所有任務 (慎用) |
crontab -u user -e | root 管理他人任務 |
crontab /path/file | 從檔案匯入 |
* * * * * 執行命令
│ │ │ │ └─ 週幾 (0-7) (0 或 7 = 星期日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小時 (0-23)
└────────── 分鐘 (0-59)
| 符號 | 含義 | 範例 |
|---|---|---|
* | 所有可能值 | * * * * * 每分鐘 |
, | 列舉值 | 0,30 * * * * 每小時 0 分與 30 分 |
- | 範圍 | 9-18 * * 1-5 工作日 9-18 點每分鐘 |
/ | 步進 | */10 * * * * 每 10 分鐘 |
# 每天 03:00 備份資料庫
0 3 * * * /usr/local/bin/backup_db.sh >> /var/log/backup.log 2>&1
# 每小時第 5 分鐘檢查服務
5 * * * * /usr/local/bin/check_service.sh
# 每週一 04:00 清理暫存檔 (保留 7 天)
0 4 * * 1 find /tmp -type f -mtime +7 -delete
# 開機後 5 分鐘執行一次 (需 @reboot 支援)
@reboot sleep 300 && /usr/local/bin/startup_task.sh
# 每 2 天 02:00 同步時間
0 2 */2 * * /usr/sbin/ntpdate pool.ntp.org
# 工作日 09:00-18:00 每 30 分鐘監控
*/30 9-18 * * 1-5 /usr/local/bin/monitor.sh
PATH=/usr/bin:/bin、SHELL=/bin/sh、無使用者 profile/usr/bin/docker、/usr/local/bin/python3)source /etc/profile; source ~/.bash_profilePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
MAILTO="admin@example.com"
0 3 * * * /usr/local/bin/backup.sh
# 1. 重導向到檔案 (推薦)
* * * * * /cmd >> /var/log/cmd.log 2>&1
# 2. 郵件通知 (需郵件系統)
MAILTO="admin@example.com"
* * * * * /cmd
# 3. 系統日誌 (syslog/journald)
* * * * * /cmd 2>&1 | logger -t mycron
# 4. 丟棄輸出 (靜默)
* * * * * /cmd > /dev/null 2>&1
# 系統日誌
grep CRON /var/log/syslog # Debian/Ubuntu
grep CRON /var/log/cron # RHEL/CentOS
journalctl -u cron -f # systemd 系統
# 使用者專屬 (若配置)
cat /var/log/user_cron.log
RandomizedDelaySec)# 1. 服務單元 /etc/systemd/system/backup.service
[Unit]
Description=Database Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_db.sh
# 可加資源限制
MemoryMax=500M
CPUQuota=50%
# 2. 計時器單元 /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true # 開機補跑漏跑
RandomizedDelaySec=15m # 隨機延遲 0-15 分鐘 (避免尖峰)
[Install]
WantedBy=timers.target
# 3. 啟用
systemctl daemon-reload
systemctl enable --now backup.timer
# 4. 查看
systemctl list-timers --all
journalctl -u backup.service -f
crontab 簡單普及,適合用戶級簡單排程;生產環境核心服務建議遷移 systemd timer 獲得完整可觀測性與資源控制。關鍵成功因素:絕對路徑、環境變數宣告、輸出重導向、持久化日誌。