在 Linux 中,cron 工作是排程的 shell 指令,會以固定間隔自動執行,由 crontab 檔案中的五欄運算式定義。這五個欄位依序為分鐘、小時、日期、月份、星期,每個欄位接受數字、範圍、通配符或步進值,例如 */15 代表每 15 分鐘。建立 cron 工作的方式是寫下運算式,在後面加上要執行的指令,然後將該行儲存到正確的 crontab,讓 cron 守護程式接管。真正困難的地方通常不是指令本身,而是選對欄位值來符合你實際想要的排程,又不會搞混哪一欄是月份、哪一欄是星期幾。Cron 運算式產生器將七個常見預設(每分鐘、每 N 分鐘、每小時、每日、工作日、每週、每月)對應到標準 crontab 欄位,讓你以白話描述排程並複製結果。之後,你只需要把該行貼到使用者個人的 crontab 或系統層級檔案,並確認排程器的時區即可。

Linux Cron 工作實際包含的內容
crontab 項目只是用空白串接的兩部分:排程運算式與 shell 指令。排程是五欄 cron 運算式,而指令可以是單一可執行檔路徑、腳本呼叫,或以管線串接的 shell 命令。cron 守護程式在啟動時、使用者執行 crontab -e 時,以及定期重新載入時會重新讀取 crontab,因此編輯後無需重新啟動伺服器即可生效。
每位使用者都可以擁有自己的 crontab,root 則可以編輯 /etc/crontab 內的系統層級排程,或將檔案放入 /etc/cron.d。運算式本身只描述時間,不包含指令、工作目錄、環境變數、重試、鎖定或監控。這些都必須放在五欄之後附加的指令中,這也是為什麼包裝腳本通常是最安全的地方,用來放置實際邏輯並記錄結果。
五欄 Cron 運算式白話說明
依照傳統 crontab 規定的確切順序,這五個欄位為分鐘、小時、日期、月份、星期。產生器將分鐘限制在 0 到 59,小時限制在 0 到 23,星期限制在星期日 0 到星期六 6,月份日期限制在 1 到 31,因此你無法意外輸入超出範圍的值。下表整理了每個欄位的標準範圍與簡短範例。
| 位置 | 欄位 | 範圍 | 範例 | 意義 |
|---|---|---|---|---|
| 1 | 分鐘 (Minute) | 0-59 | */15 | 每 15 分鐘 |
| 2 | 小時 (Hour) | 0-23 | 9 | 上午 9 點 |
| 3 | 日期 (Day of month) | 1-31 | 1 | 每月第一天 |
| 4 | 月份 (Month) | 1-12 | * | 每月 |
| 5 | 星期 (Day of week) | 0-6 (0 和 7 = 星期日) | 1-5 | 週一至週五 |
任何欄位中的星號代表該欄位的所有有效值,因此小時欄位中的 * 表示每小時執行一次。逗號列出特定值,連字號定義包含首尾的範圍,斜線則代表步進。在標準 Unix 編號下,星期欄位 1-5 涵蓋週一至週五,實作遵循 Linux man-pages crontab(5) 參考手冊所記載的標準 crontab(5) 語法。
使用 Cron 運算式產生器建立排程
要快速取得你想要的五欄運算式,最快的方法是使用 Cron 運算式產生器,它會將有限範圍的排程預設對應到標準 crontab 欄位。開啟工具後,依照下列步驟操作。
- 從七個預設中選擇最符合工作頻率的排程類型:每分鐘、每 N 分鐘、每小時、每日、工作日、每週、每月。
- 設定該排程所顯示的間隔、分鐘、小時、星期或日期,因為相關控制項只會在你選擇的預設中出現,且產生的運算式與白話摘要會立即更新。
- 複製五欄運算式,並在加入指令前於目標排程器和時區中驗證。
這些預設刻意避免同時設定日期與星期,因為該組合會觸發實作特有的 OR 行為,在某些 cron 實作中可能產生非預期的符合。產生過程在本地端進行,不會上傳任何指令或排程,因此離開瀏覽器的只有你複製的運算式字串。
產生運算式中會看到的符號
產生器僅使用 crontab(5) 所記載的通配符、步進、固定值與包含首尾的星期範圍語法,使輸出與 Linux 上傳統 Unix 風格的 crontab 項目相容。
| 符號 | 意義 | 範例 | 結果 |
|---|---|---|---|
| * | 欄位中所有有效值 | * | 每分鐘 (在分鐘欄位中) |
| , | 列出多個值 | 0,30 | 在第 0 與第 30 分鐘 |
| - | 包含首尾的範圍 | 1-5 | 週一至週五 |
| / | 步進值 | */10 | 每 10 分鐘 |
由於產生器僅限使用這四種語法形式,你可以將結果直接貼入標準的 Linux crontab 而無需轉譯。若之後想確認該行程式是否會在預期時間觸發,可將其送入 Cron Parser 來查看相同運算式未來幾個符合的時間戳。
Linux Cron 工作的常見陷阱
即使運算式正確,Linux 特有的幾項行為仍會在初次部署時讓人踩坑。在依賴排程之前,請留意以下事項。
- Cron 執行時使用的是排程器設定的時區,不一定是你工作站顯示的時區。請檢查 /etc/timezone 或守護程式啟動時使用的 TZ 值。
- 日光節約時間轉換可能會跳過或重複本地時鐘時間,因此排程在春季順延的星期日凌晨 2:30 的工作,該日可能永遠不會執行。
- 排程在每月 29、30 或 31 日的工作,在沒有該日期的月份會被靜默略過,二月通常是主因。
- 運算式僅描述時間,不包含重試、鎖定或監控。請使用等冪的指令,將失敗寫入記錄檔,並在工作可能超過執行間隔時防止重疊執行。
將運算式加入 Linux Crontab
安全的流程是先在產生器中選擇排程,複製五欄運算式,然後才在目標 crontab 中加上指令。若要編輯目前使用者的 crontab,請在 shell 中執行 crontab -e;若要編輯 root 的 crontab,請使用 sudo crontab -e。若要新增系統層級的項目,請將檔案放入 /etc/cron.d/ 或加入 /etc/crontab,後者使用稍微不同的六欄格式,會包含使用者欄位。
一般格式為五個欄位,後接指令:
<minute> <hour> <day> <month> <weekday> /path/to/command args
例如,在產生器中選取「每個工作日 09:30」後,你可以貼上:
30 9 * * 1-5 /opt/backup/run.sh >> /var/log/backup.log 2>&1
該行程式會在週一至週五的 09:30 執行備份腳本,並將 stdout 與 stderr 都附加到記錄檔。請先手動測試指令,在非生產環境中部署,確認排程器的時區,再正式上線。
部署前確認目標排程器
有些代管的排程器在標準五欄之上額外加入秒數、年份、問號或供應商專屬語法,因此部署前請先確認目標排程器接受標準的五欄 cron。Cronie 的實作記載於 cronie-crond/cronie crontab(5),是多數現代 Linux 發行版依循的參考實作,它完全接受產生器所產生的語法。如果你是部署到預期使用六欄 Quartz 運算式的代管平台,請改用 Quartz 專用的產生器,而不是強行把五欄輸出塞進需要秒數欄位的欄位。
若想深入了解,請參閱 Basic Linux Commands: 13 Safe Templates to Copy。