cron 運算式是一個簡潔的五欄位字串,用來定義排程工作何時執行:分鐘、小時、日期、月份,以及星期幾。標準格式為 * * * * *,其中每個星號都是萬用字元,可替換為特定數字、範圍、清單或步進值。手動撰寫這些運算式需要牢記確切的欄位順序與語法規則,而這些規則在不同的排程器之間略有差異,例如 Linux crontab、Kubernetes CronJobs 以及各種雲端平台。與其每次都要猜測或查閱欄位順序,不如使用瀏覽器型的 Cron 運算式產生器,從易讀的排程來建立運算式。

無論你是需要在每天凌晨 2 點執行備份腳本、在每週一中午清理記錄檔,或是在每月第一天觸發資料庫同步,產生器都能讓你選擇頻率並設定確切時間,而無需擔心欄位順序。你首先選擇排程類型——每小時、每天、每週、每月、每年或自訂——然後調整該排程類型所顯示的間隔、分鐘、小時、星期幾或月份日期。工具會即時更新五欄位運算式,你可以直接複製並貼到排程器中。這種做法能避免語法錯誤並節省時間,特別是在你需要為不同頻率建立多個工作時。

Cron 運算式被應用於許多環境中,從本機 Linux 伺服器到像 Kubernetes、AWS CloudWatch 及 Google Cloud Scheduler 等雲端平台。每個環境對欄位的解釋可能略有不同,特別是在像星期幾與日期衝突或時區處理這類邊界情況。例如,Kubernetes CronJobs 預設使用 UTC,而 Linux crontab 則使用系統的本地時區。產生器會輸出標準的五欄位運算式,但你仍應在目標排程器中加以驗證,並確認時區符合預期。此外,整個工具都在你的瀏覽器中執行,因此不會將任何排程細節傳送至伺服器,能確保你的工作定義保持私密。

how to create a cron job
how to create a cron job

Cron 運算式的運作方式

Cron 運算式由五個以空格分隔的欄位組成。每個欄位可包含數字、萬用字元、範圍、清單或步進值。以下說明每個欄位的意義:

欄位 允許值 特殊字元 範例
分鐘 0–59 *,-/ 00,30*/15
小時 0–23 *,-/ 28-17*/2
日期 1–31 *,-/? 115,30L
月份 1–12 或 JAN–DEC *,-/ 1JAN,JUN,DEC*/3
星期幾 0–7(0 與 7 代表星期日)或 SUN–SAT *,-/?L# 0MON-FRI5L

萬用字元與特殊字元讓你能建立靈活的排程。例如,*/5 * * * * 表示每 5 分鐘執行一次工作,而 0 0 1 * * 則表示在每月第一天的午夜執行。某些排程器(例如 Kubernetes)支援用於年份的選用第六欄位,但本產生器聚焦於多數系統所使用的標準五欄位格式。

三步驟建立 Cron 運算式

若想在不牢記欄位順序的情況下建立 cron 運算式,請使用 Cron 運算式產生器 依循下列步驟:

  1. 選擇排程類型:挑選符合你工作需求的頻率。可選項目如下:

    • Hourly(每小時):在指定的分鐘,每 X 小時執行一次。
    • Daily(每日):每天在指定時間執行。
    • Weekly(每週):在指定的星期幾於指定時間執行。
    • Monthly(每月):在指定的月份日期於指定時間執行。
    • Yearly(每年):在指定的月份與日期於指定時間執行。
    • Custom(自訂):針對進階排程手動設定每個欄位。
  2. 設定間隔與時間:依所選排程類型調整顯示的控制項。例如:

    • 對於每小時的工作,請設定分鐘(例如 0 代表整點)以及間隔(例如每 2 小時)。
    • 對於每週的工作,請挑選星期幾(例如星期一)與時間(例如 14:30)。
    • 對於每月的工作,請挑選月份日期(例如 1 號、15 號或最後一天)與時間。

    在你調整控制項時,工具會即時更新五欄位運算式。

  3. 複製並驗證運算式:當運算式符合你的排程時,請將其複製到剪貼簿。在貼到排程器之前,請先在目標環境中加以驗證。例如:

    • 在 Linux crontab 中,執行 crontab -e 並貼上運算式,後面接著要執行的指令。
    • 在 Kubernetes 中,建立一份 CronJob 設定檔,並將 schedule 欄位設為你的運算式。
    • 在 AWS 或 Google Cloud 等雲端平台中,將運算式貼到排程器的設定面板。

    請務必檢查排程器中的時區設定,以確保工作在預期的本地時間執行。

常見的 Cron 工作使用情境

Cron 工作能自動化許多環境中的重複性任務。以下是一些常見的使用情境及其對應的 cron 運算式,皆透過本工具產生:

使用情境 排程類型 Cron 運算式
每天凌晨 2 點執行備份腳本 Daily 0 2 * * *
每週一中午清理暫存檔案 Weekly 0 12 * * 1
每月 1 號與 15 號凌晨 3 點同步資料庫 Monthly 0 3 1,15 * *
每 6 小時檢查系統更新 Hourly 0 */6 * * *
每月最後一天晚上 11 點產生月度報表 Monthly 0 23 L * *
每個工作日上午 9 點發送提醒郵件 Weekly 0 9 * * 1-5

以上範例展示了產生器如何簡化常見排程的運算式建立過程。針對更複雜的情境,例如在每週一到週五上午 9 點到下午 5 點之間每 10 分鐘執行一次工作,你可以使用自訂排程類型手動設定每個欄位。工具的即時回饋能幫助你避免語法錯誤,並確保運算式符合你的預期。

驗證並測試你的 Cron 運算式

產生 cron 運算式後,在實際依賴它之前,務必先在目標排程器中加以驗證。以下說明在不同環境中的測試方式:

  • Linux crontab:執行 crontab -e 以編輯使用者的 crontab 檔案。加入一行包含運算式與用來記錄輸出的指令,例如:

    0 2 * * * /path/to/backup.sh >> /var/log/backup.log 2>&1

    在排程時間之後檢查記錄檔,以確認工作確實執行。

  • Kubernetes CronJob:建立一份 YAML 設定檔,並將運算式置於 schedule 欄位。例如:

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: backup
    spec:
      schedule: "0 2 * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: backup
                image: busybox
                command: ["/bin/sh", "-c", "echo Backup completed at $(date)"]
              restartPolicy: OnFailure

    使用 kubectl apply -f backup.yaml 套用設定檔,並透過 kubectl get cronjobskubectl get jobs 檢查工作狀態。

  • 雲端平台:在 AWS CloudWatch Events、Google Cloud Scheduler 或 Azure Logic Apps 中,將運算式貼到排程器的設定面板。多數平台會預先顯示接下來幾次執行時間,你可用來驗證排程。例如,AWS CloudWatch Events 在你儲存規則時會顯示接下來 10 次的觸發時間。

時區處理是常見的混淆來源。Linux crontab 預設使用系統的本地時區,而 Kubernetes CronJobs 則使用 UTC。本產生器以 UTC 輸出運算式,因此若你的排程器使用不同時區,可能需要相應調整小時欄位。例如,若你希望在 UTC+2 時區於本地凌晨 2 點執行工作,請在產生器中將小時欄位設為 0(UTC 午夜)。

在除錯方面,你可以使用像 Unix 時間戳轉換器 等工具來確認 cron 運算式實際觸發的確切時間。將下一次預定執行時間轉換為你的本地時區,以確認是否符合排程。若工作未如預期執行,請檢查排程器的記錄以找出錯誤。在 Linux 中,cron 記錄通常位於 /var/log/syslog/var/log/cron,而 Kubernetes 記錄則可透過 kubectl logs 檢視。

進階 Cron 運算式功能

雖然產生器涵蓋了大部分常見的排程,但一些進階的使用情境需要手動調整運算式。以下是許多排程器支援的幾項功能:

  • 步進值:使用 / 字元可在某個範圍內以固定間隔執行工作。例如,*/15 * * * * 會每 15 分鐘執行一次工作,而 0 9-17/2 * * * 則會在上午 9 點到下午 5 點之間,每 2 小時執行一次。

  • 範圍與列表:使用 - 字元可指定範圍(例如 1-5 代表週一至週五),使用 , 字元可指定列表(例如 1,15 代表當月的 1 號和 15 號)。

  • 當月最後一天:在「日」欄位中使用 L,即可在當月最後一天執行工作。例如,0 0 L * * 會在每個月的最後一天的午夜執行。

  • 帶有偏移的星期幾:使用 # 可指定當月第幾個星期幾。例如,0 0 * * 1#3 會在每個月第 3 個週一的午夜執行工作。

  • 問號表示無特定值:在「日」或「星期幾」欄位中使用 ?,表示不指定特定值。當您想設定其中一個欄位、但不設定另一個時,這個功能非常實用。例如,0 0 1 * ? 會在每個月的 1 號執行工作,無論星期幾。

並非所有排程器都支援這些進階功能,因此在使用前請先查閱您所用排程器的說明文件。產生器對所有排程類型都支援步進值、範圍與列表,但若要使用 L#?,您可能需要切換到自訂排程類型。

對於無法納入標準五欄位格式的複雜排程,建議將工作拆分為多個 cron 運算式,或使用腳本來處理邏輯。例如,如果您需要在平日每 10 分鐘執行一次工作,但週末則每小時執行一次,您可以建立兩個使用不同運算式的 cron 工作:

*/10 * * * 1-5 /path/to/job.sh
0 * * * 0,6 /path/to/job.sh

這種做法可讓運算式保持簡單且易於維護。即使是多重排程,產生器也能協助您快速建立這兩個運算式。

相關指南:如何檢查您的 JSON 格式是否正確

如果您正在權衡各種方案,在不遺失資料的情況下從 CSV 檔案移除 BOM 對此有詳細說明。

如果您正在權衡各種方案,解析 Cron 運算式並立即查看下次執行時間 對此有詳細說明。