Cron Job 是什麼?Linux 排程任務完整教學(含 Crontab 語法與範例)
Cron 會按照排程欄位,在符合的分鐘執行命令。要讓任務可靠運作,除了會寫 * * * * *,還要知道排程採用哪個時區、命令用哪個 shell 與使用者執行,以及失敗時在哪裡看輸出。
五個欄位各代表什麼
分 時 日 月 週 命令
0 9 * * 1-5 /path/to/job.sh
這行表示符合排程時,在週一到週五的 09:00 執行。*/5 * * * * 是每小時的 0、5、10 等分鐘;0 0 1 * * 是每月 1 日的午夜。使用者 crontab 只有五個時間欄位和命令;/etc/crontab、/etc/cron.d/ 的系統設定還要在命令前多寫使用者欄位。日期與星期欄位若同時受限制,部分 cron 實作會用「任一符合」判斷,不能直覺當成 AND。細節見 crontab(5)。
| 需求 | crontab 時間欄位 | 解讀 |
|---|---|---|
| 每 15 分鐘 | */15 * * * * | 每小時 00、15、30、45 分 |
| 每天 02:30 | 30 2 * * * | 依排程時區的 02:30 |
| 每週一 09:00 | 0 9 * * 1 | 星期一 09:00 |
這裡只列五個時間欄位,實際 crontab 每行後面還要有命令。*/15 並非「上一個任務結束後再等 15 分鐘」;長任務仍可能與下一次排程重疊。
用不會改動資料的任務先測排程
在 Linux 的使用者 crontab 加入一行,把時間戳寫到自己的家目錄:
crontab -e
* * * * * /usr/bin/date -Is >> "$HOME/cron-demo.log" 2>&1
儲存後用 crontab -l 確認內容,稍等下一個分鐘邊界,再看 tail "$HOME/cron-demo.log"。不再需要時,重新用 crontab -e 刪除這一行;不要為了清掉示範而執行 crontab -r,那會刪掉整份使用者排程。
正式腳本使用絕對路徑,先以相同使用者在終端機執行,確認它不依賴互動提示。標準輸出和錯誤輸出應進入可讀日誌,並安排輪替。cron 的預設環境通常比登入 shell 精簡,別假設 .zshrc、虛擬環境或 nvm 會自動載入。
例如 Python 腳本不要只寫 python report.py;先用 command -v python3 找到你要的解譯器,並為腳本、輸出檔設定絕對路徑。若使用虛擬環境,排程可直接指向該環境的 bin/python。排程使用者對腳本和日誌目錄都必須有對應權限。最先測試的命令應保持無害,確認時間與身分正確後再換成正式任務。
Cron 的時區與夏令時間
先用 date 或 timedatectl 看主機時區,並確認所用 cron 實作。Cronie 的 crontab 支援 CRON_TZ,例如:
CRON_TZ=Asia/Taipei
0 9 * * 1-5 TZ=Asia/Taipei /usr/bin/date -Is >> "$HOME/cron-demo.log" 2>&1
這代表排程時間以台北時區解讀;命令前的 TZ=Asia/Taipei 則讓 date 輸出台北時間。若只設定 CRON_TZ,日誌中的 date -Is 仍可能依主機時區顯示,不能據此判斷排程時間錯誤。不是所有 cron 實作都有相同的 CRON_TZ 行為,部署前要查機器上的 man 5 crontab。若系統跨時區或有夏令時間,跳過的本地時間可能不執行,重複的一小時可能執行兩次。重要工作應設計成可重入,或使用能清楚管理時區與執行狀態的排程器。參考 crontab 時區與 DST 說明。
任務沒執行時怎麼查
crontab -l確認裝的是目前使用者的排程,並核對五欄語法。- 確認 cron 服務有運作。不同發行版可能叫
cron或crond,可看systemctl status cron或systemctl status crond。 - 檢查任務日誌與系統日誌;例如
journalctl -u cron或發行版的 syslog。別只靠終端機中的成功執行判斷。 - 用絕對路徑檢查命令和檔案權限,並確認服務使用者能讀寫目標目錄。權限觀念可看 Linux 群組與權限。
- 若命令含
%,查所用 cron 的跳脫規則;在 Cronie 的 crontab 命令中,未跳脫的%會被特殊處理。
若一個任務可能跑超過排程間隔,兩次執行可能重疊。可依環境用鎖或服務端去重處理;鎖定失敗、任務逾時和重試也要記錄,不要只靠排程語法解決。
在提供 flock 的 Linux 上,可以讓單一任務持有鎖,降低重疊執行風險,例如 flock -n /tmp/report.lock /absolute/path/report.sh。-n 會在鎖已被持有時立即返回,適合「下一輪可以跳過」的工作;若每一輪都必須執行,應改用佇列或其他排程設計。鎖檔路徑須選擇該使用者可寫、且同機所有相關任務都共用的位置。