Cron Job 是什麼?Linux 排程任務完整教學(含 Crontab 語法與範例)

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:3030 2 * * *依排程時區的 02:30
每週一 09:000 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 說明。

任務沒執行時怎麼查

  1. crontab -l 確認裝的是目前使用者的排程,並核對五欄語法。
  2. 確認 cron 服務有運作。不同發行版可能叫 cron 或 crond,可看 systemctl status cron 或 systemctl status crond。
  3. 檢查任務日誌與系統日誌;例如 journalctl -u cron 或發行版的 syslog。別只靠終端機中的成功執行判斷。
  4. 用絕對路徑檢查命令和檔案權限,並確認服務使用者能讀寫目標目錄。權限觀念可看 Linux 群組與權限。
  5. 若命令含 %,查所用 cron 的跳脫規則;在 Cronie 的 crontab 命令中,未跳脫的 % 會被特殊處理。

若一個任務可能跑超過排程間隔,兩次執行可能重疊。可依環境用鎖或服務端去重處理;鎖定失敗、任務逾時和重試也要記錄,不要只靠排程語法解決。

在提供 flock 的 Linux 上,可以讓單一任務持有鎖,降低重疊執行風險,例如 flock -n /tmp/report.lock /absolute/path/report.sh。-n 會在鎖已被持有時立即返回,適合「下一輪可以跳過」的工作;若每一輪都必須執行,應改用佇列或其他排程設計。鎖檔路徑須選擇該使用者可寫、且同機所有相關任務都共用的位置。

BenZ Software Developer

熱愛技術的軟體開發者,在這裡分享程式開發經驗與學習筆記。

本週主打

AI 自動化入門包

你每天手動在做的那些煩事,其實 AI 可以自己跑。這份給你 10 個照著做就會的自動化工作流 + 50 個複製即用的提示詞,不用會寫程式。

看看這個產品 →