如何使用此計算機
使用視覺化介面選擇分鐘、小時、日期、月份和星期。或直接輸入 cron 表達式來驗證。
公式與原理
Cron 格式:分 時 日 月 星期。* 代表每個值。*/5 代表每 5 個單位。
計算範例
「0 9 * * 1-5」= 週一到週五早上 9 點。「*/30 * * * *」= 每 30 分鐘。
專家建議
月份 1-12,星期 0-7(0 和 7 都是星期日)。上線前務必用本工具或實際環境驗證一次,排程寫錯往往要等到該執行的時間點才會發現。
最常被踩的坑:「日」和「星期」是 OR 不是 AND
當你同時指定「日期」和「星期」欄位時,cron 的行為是 OR——只要其中一個符合就會執行,而不是兩個都要符合。例如 0 0 1 * 1 不是「每月 1 號且是星期一」,而是「每月 1 號執行,而且每個星期一也執行」。
要真的達成「每月 1 號且是星期一」,cron 本身做不到,得在腳本裡自己判斷(例如開頭加一行檢查 [ "$(date +\%u)" = "1" ] || exit 0)。這個 OR 行為是 cron 規格的一部分,不是某個系統的 bug。
常用排程速查
| 表達式 | 意思 |
|---|---|
*/5 * * * * | 每 5 分鐘 |
0 * * * * | 每小時整點 |
0 3 * * * | 每天凌晨 3 點 |
0 9 * * 1-5 | 週一到週五早上 9 點 |
0 0 1 * * | 每月 1 號午夜 |
0 0 * * 0 | 每週日午夜 |
30 2 1,15 * * | 每月 1 號和 15 號的 2:30 |
0 */6 * * * | 每 6 小時(0、6、12、18 點) |
時區與環境變數
cron 使用的是伺服器的系統時區,不是你所在地的時區。台灣的伺服器如果設成 UTC,寫 0 9 * * * 會在台灣時間下午 5 點執行(UTC+8)。部署前先用 date 確認伺服器時區,或在 crontab 開頭設 CRON_TZ=Asia/Taipei(部分 cron 實作支援)。
另一個常見問題是環境變數不同:cron 執行時的 PATH 通常比你登入 shell 時精簡很多,所以在終端機跑得好好的指令,放進 cron 卻找不到執行檔。解法是在 crontab 裡用絕對路徑(例如 /usr/bin/python3),或在腳本開頭自己 source 需要的環境設定。
把輸出留下來,不然出錯你不會知道
cron 預設會把工作的輸出寄到系統郵件,但多數伺服器沒設好郵件、等於直接丟掉。建議把輸出導向記錄檔:0 3 * * * /path/to/job.sh >> /var/log/job.log 2>&1,其中 2>&1 會把錯誤訊息也一起寫入。沒有這一行,排程默默失敗好幾週都不會有人發現。