alltools.one
DevOps
2026-02-25
11 min
alltools.one Team
cronschedulingdevopsautomationlinux

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* , - /

月和星期欄位在大多數實作中也接受三字母縮寫(JANDECSUNSAT)。

特殊字元說明

理解四個特殊字元即可解鎖 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

其他常見簡寫:

簡寫等效表達式
@yearly0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily0 0 * * *
@hourly0 * * * *

不同環境中的 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 的 YAMLDocker 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 分鐘

延伸閱讀


準備建構下一個 cron 表達式了嗎?開啟 Cron 表達式建構器,一次就把排程設定對。

Published on 2026-02-25
Cron Expression Cheat Sheet — Schedule Like a Pro | alltools.one