排程在互動終端能跑,不代表背景環境也能跑。PATH、工作目錄、權限、時區和輸出位置都要寫清楚,並保留可追查的 log。
動手前:先用目前帳號手動執行同一條命令,再建立排程。不要把密碼放進 crontab 或 plist;系統級排程與使用者級排程的權限邊界不同。
cron/crontab
列出目前使用者排程Linux/macOS cron
crontab -l只讀取目前使用者的 crontab。
編輯目前使用者排程Linux/macOS cron
crontab -e保存前確認編輯器與時區。
先匯出 crontab 備份Linux/macOS cron
crontab -l > crontab-backup.txt若原本沒有 crontab,結束碼可能非 0。
每天 02:15 執行並寫 logcron
15 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1系統 crontab 和使用者 crontab 欄位數可能不同。
每 10 分鐘執行cron
*/10 * * * * /usr/local/bin/healthcheck.sh腳本本身應避免重複執行互撞。
用完整 PATHcron
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin放在 crontab 前段,避免互動 shell 的 PATH 差異。
systemd timer
列出所有 timersystemd Linux
systemctl list-timers --all顯示上次與下次執行時間。
查看單一 timer 狀態systemd Linux
systemctl status backup.timertimer 與它觸發的 service 是兩個 unit。
查看 timer 定義systemd Linux
systemctl cat backup.timer同時看 vendor unit 與 drop-in。
查看觸發服務 logsystemd Linux
journalctl -u backup.service -n 100 --no-pager排程成功不代表工作內容成功,要看 service exit code。
檢查日曆表示式systemd Linux
systemd-analyze calendar 'Mon..Fri 02:15'會顯示下一次觸發時間。
啟用並立即啟動 timersystemd Linux
sudo systemctl enable --now backup.timer會改開機行為;先確認 unit 內容。
手動跑一次對應 servicesystemd Linux
sudo systemctl start backup.service先在維護窗測試,並查看 journal。
macOS launchd
檢查 plist 語法macOS
plutil -lint ~/Library/LaunchAgents/com.example.job.plist只檢查 plist 格式,不代表命令一定能執行。
列出目前 GUI domain 工作macOS
launchctl print gui/$(id -u)輸出很多,可再用 grep 找 label。
查看單一 LaunchAgentmacOS
launchctl print gui/$(id -u)/com.example.joblabel 必須和 plist 內一致。
載入使用者 LaunchAgentmacOS
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.job.plist舊版 load 語法已逐步被 bootstrap domain 模型取代。
觸發已載入工作macOS
launchctl kickstart -k gui/$(id -u)/com.example.job-k 會先終止既有 instance 再啟動,可能影響工作。
卸載使用者 LaunchAgentmacOS
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.job.plist先確認 label 與路徑,避免卸載錯工作。
怎麼確認有做對
- 手動執行同一個 executable 與參數。
- 確認排程器顯示的上次執行時間與 exit status。
- 檢查輸出 log、產物時間與業務健康檢查。
常見錯誤
- 依賴互動 shell 的 PATH、alias 或工作目錄。
- 排程沒有鎖,前一次未結束就重複啟動。
- 只看 timer/cron 有觸發,沒有看工作 exit code。
- macOS 混用 system、user、gui domain。
版本與官方文件
參數會隨工具版本與作業系統實作改變。正式環境先用 --help、-h 或系統內建說明確認,再以當版官方文件為準。