Cron 表達式速查表 — 像專家一樣排程任務
Cron 是 Unix 類系統中排程任務自動化的基石。無論是日誌輪換、資料庫備份還是觸發 CI/CD 流水線,cron 表達式定義了這些任務何時執行。語法簡潔但強大——如果靠猜測很容易出錯。
本參考涵蓋了 cron 語法的每個部分,並附有實用的可複製貼上的範例。如果你想互動式地建構和驗證表達式,請在閱讀本指南的同時開啟 Cron 表達式建構器。
Cron 語法:五個欄位
標準 cron 表達式由空格分隔的五個欄位組成:
┌───────────── 分鐘 (0–59)
│ ┌───────────── 小時 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12)
│ │ │ │ ┌───────────── 星期 (0–7,其中 0 和 7 = 星期日)
│ │ │ │ │
* * * * *
每個欄位接受特定值、範圍、列表或萬用字元。五個欄位組合在一起指定精確的重複排程。
| 欄位 | 允許值 | 特殊字元 |
|---|---|---|
| 分鐘 | 0–59 | * , - / |
| 小時 | 0–23 | * , - / |
| 日 | 1–31 | * , - / |
| 月 | 1–12 | * , - / |
| 星期 | 0–7 | * , - / |
月和星期欄位在大多數實作中也接受三字母縮寫(JAN–DEC、SUN–SAT)。
特殊字元說明
理解四個特殊字元即可解鎖 cron 的全部功能:
星號 * — 「每個」
匹配該欄位的所有可能值。
* * * * * # 每天每小時每分鐘執行
逗號 , — 「和」
指定離散值列表。
0 9,12,18 * * * # 每天 9:00、12:00 和 18:00 執行
連字號 - — 「到」
定義包含範圍。
0 9-17 * * * # 從上午 9 點到下午 5 點每小時執行
斜線 / — 「每第 n 個」
從範圍起始設定步進間隔。
*/10 * * * * # 每 10 分鐘(0、10、20、30、40、50)
可以將範圍與步進結合:
0 9-17/2 * * * # 上午 9 點到下午 5 點每 2 小時(9、11、13、15、17)
常用 Cron 排程範例
收藏此表。這些是你會反覆使用的排程。
| 排程 | 表達式 | 說明 |
|---|---|---|
| 每分鐘 | * * * * * | 每分鐘開始時執行 |
| 每 5 分鐘 | */5 * * * * | 第 0、5、10、15、…、55 分鐘 |
| 每 15 分鐘 | */15 * * * * | 第 0、15、30、45 分鐘 |
| 每小時 | 0 * * * * | 每小時第 0 分鐘執行 |
| 每 6 小時 | 0 */6 * * * | 00:00、06:00、12:00、18:00 |
| 每天午夜 | 0 0 * * * | 每天一次,00:00 執行 |
| 每天凌晨 3 點 | 0 3 * * * | 每天一次,03:00 執行 |
| 每週一上午 9 點 | 0 9 * * 1 | 每週一 09:00 執行 |
| 工作日上午 8 點 | 0 8 * * 1-5 | 週一至週五 08:00 |
| 週末中午 | 0 12 * * 0,6 | 週六、週日 12:00 |
| 每月 1 日 | 0 0 1 * * | 每月 1 日午夜 |
| 每季度(1、4、7、10 月) | 0 0 1 1,4,7,10 * | 季度月 1 日午夜 |
| 工作時間每 15 分鐘 | */15 9-17 * * 1-5 | 工作日 9 點–17 點,每 15 分鐘 |
將任何表達式貼到 Cron 表達式建構器 中以視覺化下次執行時間。
進階模式
組合列表和範圍
欄位接受混合語法。在工作日上午 8 點和下午 6 點執行任務:
0 8,18 * * 1-5
使用步進指定特定月份:
0 0 1 1-12/3 * # 從一月開始每 3 個月(1月、4月、7月、10月)
日 vs. 星期
當日和星期都被設定(非 *)時,行為取決於實作。在標準 cron 中,如果任一條件滿足,任務就會執行——是 OR 關係,不是 AND。這讓很多人措手不及。
0 0 15 * 1 # 在 15 日和每週一執行——不是「15日的週一」
啟動時執行
雖然嚴格來說不是 cron 表達式,但 @reboot 是一個廣泛支援的簡寫:
@reboot /usr/local/bin/start-service.sh
其他常見簡寫:
| 簡寫 | 等效表達式 |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
不同環境中的 Cron
五欄位語法是通用的,但設定 cron 的方式因平台而異。
Linux Crontab
經典方式。使用 crontab -e 編輯使用者 crontab:
# 每天凌晨 2 點執行備份
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
/etc/cron.d/ 中的系統級 cron 任務包含額外的使用者欄位:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actions 在 schedule 觸發器中使用相同的五欄位語法。所有時間為 UTC。
on:
schedule:
- cron: '0 3 * * 1-5' # 工作日 UTC 凌晨 3 點
有關 YAML 設定的深入了解,請參閱 Kubernetes 的 YAML 和 Docker Compose 的 YAML。
Kubernetes CronJob
Kubernetes 將 cron 表達式封裝在 CronJob 資源中:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
Kubernetes 預設使用 UTC。從 v1.25 開始,你可以在 CronJob 規格中設定 timeZone: "America/New_York"。
AWS CloudWatch (EventBridge)
AWS 使用稍有不同的語法,包含六個欄位(新增秒)和 rate() / cron() 包裝器:
cron(0 3 * * ? *) # 每天 UTC 凌晨 3 點
注意 ? 字元——當另一個被指定時,AWS 要求日或星期中的一個使用 ?。這與標準 cron 不同。
常見陷阱
1. 時區混淆
Cron 在 Linux 上預設使用系統時區,但 Kubernetes 和 GitHub Actions 在 UTC 下執行。設定為 0 9 * * * 的任務將在 UTC 上午 9 點觸發,即台北時間下午 5 點。
始終驗證排程器使用的時區。有關時間戳轉換,我們的 Unix 時間戳詳解 指南詳細介紹了 UTC 偏移。
2. 執行重疊
如果任務耗時超過執行間隔,你將得到重疊的實例。在 */5 * * * * 排程上執行 8 分鐘的腳本會堆積。
解決方案:
- 使用鎖定檔案(Linux 上的
flock) - 在 Kubernetes CronJob 中設定
concurrencyPolicy: Forbid - 在腳本開始時檢查正在執行的實例
3. 輸出缺失和偵錯
Cron 預設不捕獲 stdout。始終重新導向輸出:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
如果 cron 任務沒有執行,檢查:
grep CRON /var/log/syslog查看執行日誌- 腳本的檔案權限
PATH環境變數——cron 預設有一個最小的PATH
4. 「每月 31 日」陷阱
0 0 31 * * # 僅在有 31 天的月份執行
這在 1 月、3 月、5 月、7 月、8 月、10 月和 12 月執行,但會靜默跳過其他五個月。如果需要月末任務,考慮在 1 日執行並調整腳本邏輯,或使用支援「月末」語意的工具。
5. 忘記 Crontab 末尾的換行符
某些 cron 實作要求 crontab 檔案末尾有換行符。如果最後一個條目不執行,在末尾新增空行。
視覺化建構表達式
記憶語法適用於常見模式,但複雜排程透過視覺化方式建構更容易。alltools.one 的 Cron 表達式建構器 讓你可以:
- 透過下拉選單選擇每個欄位的值
- 查看排程的人類可讀描述
- 預覽即將到來的執行時間
- 一鍵複製最終表達式
完全在瀏覽器中執行——不會向任何伺服器傳送資料。
快速參考卡
將此區塊複製到專案文件或團隊 wiki 中:
# ┌───── 分鐘 (0-59)
# │ ┌───── 小時 (0-23)
# │ │ ┌───── 日 (1-31)
# │ │ │ ┌───── 月 (1-12)
# │ │ │ │ ┌───── 星期 (0-7,日=0 或 7)
# │ │ │ │ │
# * * * * *
*/5 * * * * # 每 5 分鐘
0 * * * * # 每小時
0 0 * * * # 每天午夜
0 9 * * 1-5 # 工作日上午 9 點
0 0 1 * * # 每月 1 日
*/15 9-17 * * 1-5 # 工作時間每 15 分鐘
延伸閱讀
- Unix 時間戳詳解 — 理解紀元時間和時區轉換
- Kubernetes 的 YAML — 設定 CronJob 和其他 Kubernetes 資源
- Docker Compose 的 YAML — 在 Compose 設定中排程容器
準備建構下一個 cron 表達式了嗎?開啟 Cron 表達式建構器,一次就把排程設定對。