cron 是 Linux 系統級排程服務,透過 crontab 定義週期性任務。掌握時間表達式、環境變數、日誌追蹤與除錯技巧,能確保自動化作業穩定執行。
* * * * * 執行命令
- - - - -
| | | └─ 星期 (0-7) (Sun=0 或 7)
| | └──── 月份 (1-12)
| └────── 日期 (1-31)
└──────── 小時 (0-23)
└──────── 分鐘 (0-59)
| 符號 | 含義 | 範例 |
|---|---|---|
* | 任意值 | * * * * * 每分鐘 |
, | 列舉 | 0 8,12,18 * * * 每天 8/12/18 點 |
- | 範圍 | 0 9-18 * * 1-5 工作日 9-18 點整點 |
/ | 步長 | */15 * * * * 每 15 分鐘 |
@yearly | 每年 1/1 00:00 | 0 0 1 1 * |
@monthly | 每月 1 號 00:00 | 0 0 1 * * |
@weekly | 每週日 00:00 | 0 0 * * 0 |
@daily | 每天 00:00 | 0 0 * * * |
@hourly | 每小時 0 分 | 0 * * * * |
@reboot | 開機啟動 | 系統啟動時執行一次 |
crontab -e # 編輯當前使用者 crontab
crontab -l # 列出當前 crontab
crontab -r # 移除當前 crontab (慎用)
crontab -u user -e # root 編輯指定使用者 crontab
# /etc/crontab 格式多一個 USER 欄位
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 範例:每天 02:30 以 root 執行備份
30 2 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# /etc/cron.d/ 目錄下放置獨立檔案 (套用相同格式)
# 檔案命名建議:服務名稱,如 nginx-logrotate, certbot-renew
PATH=/usr/bin:/bin、無 HOME、SHELL=/bin/shPATH、HOME、SHELL=/bin/bash,或使用絕對路徑> /var/log/job.log 2>&1 或 &>> /var/log/job.log (Bash 4+)
# 每小時備份資料庫
0 * * * * /usr/bin/mysqldump -u backup -p'secret' db | gzip > /backup/db_$(date +\%Y\%m\%d_\%H\%M).sql.gz
# 每天凌晨清理 30 天前日誌
0 3 * * * find /var/log/app -name "*.log" -mtime +30 -delete
# 開機啟動延遲服務
@reboot sleep 30 && /opt/myapp/bin/start.sh
# 每週一產生報表並郵寄
0 9 * * 1 /usr/local/bin/gen_report.sh | mail -s "Weekly Report" admin@example.com
systemctl status cron / systemctl status crondgrep CRON /var/log/syslog 或 journalctl -u cronflock -n /tmp/job.lock -c "cmd" 或腳本內 flock -n 9 || exit 1 9>/tmp/job.lockcurl -fsS -o /dev/null https://hc-ping.com/xxx (Healthchecks.io)
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
Requires=backup.service
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=15m
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
優點:精確控制、依賴管理、日誌整合、隨機延遲避免驚群、systemd 生態整合。
建立標準化的排程部署流程(腳本化、版控、測試、監控),將 crontab 從「黑箱」轉化為可觀測、可維運的自動化基礎設施。