Cron 運算式產生器
撰寫和讀懂 crontab 排程。輸入一條 cron 運算式,就能用白話看到它何時執行、接下來幾次的執行時刻,以及五個欄位各自的意思。
分鐘
小時
日
月
星期
每分鐘。
接下來的執行
時間依你電腦所在的時區()顯示。cron 用的是伺服器的時區,兩者往往不同。
常用排程
選一條即可填入上面的輸入框。
| * * * * * | 每分鐘 |
| */5 * * * * | 每 5 分鐘 |
| */15 * * * * | 每 15 分鐘 |
| */30 * * * * | 每半小時 |
| 0 * * * * | 每小時 |
| 0 */2 * * * | 每 2 小時 |
| 0 */6 * * * | 每 6 小時 |
| 0 */12 * * * | 每天兩次 |
| 0 0 * * * | 每天午夜 |
| 0 9 * * * | 每天上午 9 點 |
| 0 9 * * 1-5 | 平日上午 9 點 |
| 0 9 * * 6,0 | 週六和週日 9 點 |
| 0 0 * * 1 | 每週一午夜 |
| 0 18 * * 5 | 每週五下午 6 點 |
| 0 0 1 * * | 每月第一天 |
| 0 0 1 1 * | 每年第一天 |
每個欄位的意思
| 欄位 | 可用數值 |
|---|---|
| 分鐘 | 0 – 59 |
| 小時 | 0 – 23 |
| 日 | 1 – 31 |
| 月 | 1 – 12, JAN – DEC |
| 星期 | 0 – 6, SUN – SAT (0 = 7) |
特殊符號
| 符號 | 意思 |
|---|---|
| * | 任意數值 |
| , | 分隔清單中的數值 |
| - | 一段數值範圍 |
| / | 範圍內的間隔 |
簡寫
| @yearly, @annually | 0 0 1 1 * |
| @monthly | 0 0 1 * * |
| @weekly | 0 0 * * 0 |
| @daily, @midnight | 0 0 * * * |
| @hourly | 0 * * * * |
| @reboot | — |
它們不屬於 POSIX 的 cron,但幾乎所有實作都接受。
最容易踩的坑
- 當「日」和「星期」都被限定時,cron 會在符合其中任一個的日子執行,而不是兩個都符合。「* * 3 * 1」在每月 3 日和每個週一都會執行。例外是其中一個以星號開頭:「* * */2 * 1」只在既是單數日又是週一的那天執行。手冊頁在這一點上寫錯了。
- 把伺服器連同 cron 一起跑在 UTC 上。寫在有日光節約時間的時區裡的排程,每年會漏掉一次執行,並在下一次切換時重複一次。
- 標準 cron 沒有秒和年的欄位。如果你需要那種精度,cron 就不是合適的工具。
- 避開 @reboot。它取決於機器是如何重新啟動的、那一刻哪些服務已經就緒,因此很難推斷。
- 五個欄位裝不下的排程,可以拆成兩條。想每 90 分鐘執行一次,就把「0 */3 * * *」和「30 1/3 * * *」並排寫上。
- 指令要寫絕對路徑。cron 的 PATH 非常短,而且幾乎沒有你的 shell 裡那些環境變數。
Cron 運算式常見問題
五個欄位分別是什麼?
依序是:分鐘、小時、日、月、星期。帶星號的欄位對應任意數值。
星期日是 0 還是 7?
都可以。多數實作的星期日既接受 0 也接受 7,也接受 SUN 到 SAT 的三字母寫法。
我的工作為什麼沒在預期的時間執行?
常見原因是伺服器在另一個時區、上面講的「日」與「星期」規則,或者因為 cron 不載入你的 shell 設定而導致指令失敗。
這個頁面會把我的運算式送到別處嗎?
不會。運算式的解析和執行時刻的計算都在你的瀏覽器裡完成,不會上傳任何內容。