返回
2026.05.21
FacebookLine

排程任務怎麼設計?Cron Job 與系統自動化入門|2026 山葵組

文章目錄

Cron Job 是在 Linux/Unix 系統上,依照指定時間自動執行的排程任務。系統中的 cron 服務會在背景持續運作,每分鐘檢查一次排程設定(crontab),時間一到就執行對應的指令或程式。每天凌晨備份資料庫、每小時同步訂單、每月初產生報表、定期清除過期的暫存檔,都是典型的 Cron Job。

「排程任務」是泛稱,Cron Job 是其中最經典的一種實作方式。以下說明 crontab 的寫法、企業系統常見的排程應用、設計排程時最容易遇到的問題,以及什麼時候該改用雲端排程或工作流引擎。

Cron Job 是什麼?排程任務的運作原理

Cron 由兩個部分組成:負責計時與觸發的背景服務(cron daemon),以及記錄「什麼時間執行什麼指令」的設定檔 crontab。cron 服務會定期讀取 crontab,時間符合條件時就執行對應的指令。

排程任務讓系統不需要人工操作,就能定期完成工作。對企業系統來說,許多每天重複發生的作業,例如同步外部資料、寄送提醒、結算與對帳,若仰賴人工執行不只耗時,也容易遺漏。透過排程自動化,這些作業可以準時、穩定地在離峰時段完成。

crontab 語法怎麼寫

crontab 的每一行代表一個排程,由五個時間欄位加上要執行的指令組成。五個欄位依序是:分(0–59)、時(0–23)、日(1–31)、月(1–12)、星期(0–7,0 與 7 都代表星期日)。星號 * 代表「每一個」。

常見範例

0 8 * * *:每天早上 8:00 執行
*/5 * * * *:每 5 分鐘執行一次
0 2 * * 1:每週一凌晨 2:00 執行
0 0 1 * *:每月 1 日午夜執行
30 9 * * 1-5:週一到週五早上 9:30 執行

一個容易誤解的規則

當「日」與「星期」兩個欄位同時指定特定值時,大多數 cron 實作採用的是「任一符合就執行」,而不是兩者同時符合。例如 0 9 13 * 5 會在每月 13 日執行,也會在每個星期五執行,而不是只在「13 日剛好是星期五」時執行。需要這種條件時,應該在程式內自行判斷。

企業系統常見的排程任務

資料同步:定時從 ERP、POS 或外部 API 取得訂單、庫存與會員資料,保持各系統資料一致。跨系統同步的做法,可參考跨系統資料同步。
報表產生:每天或每月自動彙整營收、庫存與業績數據,寄送給管理者。
通知與提醒:到期提醒、續約通知、未完成簽核的催辦。
資料維護:資料庫備份、清除過期的暫存檔與日誌、封存舊資料。
狀態檢查:定期確認付款是否完成、物流狀態是否更新、外部服務是否正常。

設計排程任務最常遇到的 4 個問題

1. 失敗了卻沒有人發現

cron 預設不會主動通知任務失敗。若沒有另外設計,排程可能已經默默失敗好幾天,直到有人發現資料沒有更新才察覺。每個重要的排程都應該記錄執行日誌,失敗時透過 Email、Slack 或 LINE 發送告警。

更進一步的做法是「心跳監控」:任務每次成功執行就回報一次,超過預期時間沒有回報就發出警示。這樣連排程根本沒有啟動的情況也能及時發現。系統告警的整合方式,可參考系統通知與內外部工具整合。

2. 重疊執行

上一次的任務還沒跑完、下一次排程又啟動時,兩個任務可能同時處理同一批資料,造成重複寄信、重複扣款或資料錯亂。常見的解法是在執行前加上鎖定機制,例如 Linux 的 flock,或使用框架提供的防重疊功能,如 Laravel 排程的 withoutOverlapping()。

3. 缺少冪等性設計

冪等性指的是同一個任務重複執行多次,結果都與執行一次相同。排程任務難免因為重試、手動補跑或重疊而重複執行,若每次都會重新寄送通知或新增一筆紀錄,就會產生錯誤。設計時應記錄每筆資料的處理狀態,已處理過的資料不再重複處理。

4. 時區不一致

cron 依照伺服器的系統時區計算時間。許多雲端伺服器預設使用 UTC,與台灣時間相差 8 小時,設定「每天 8 點」實際上會在台灣時間下午 4 點執行。設定前應確認伺服器時區,或在排程工具中明確指定時區。

伺服器停機時錯過的排程怎麼辦

傳統 cron 不會補跑錯過的任務。伺服器若在排程時間剛好停機或重新啟動,那一次的任務就會直接跳過。

對於不能遺漏的作業,例如每日結帳或對帳,任務本身應該設計成「處理所有尚未處理的資料」,而不是只處理「今天」的資料。這樣即使錯過一次,下一次執行時也能自動補齊。

Cron、雲端排程與工作流引擎怎麼選

Cron 或框架內建排程:適合簡單、彼此獨立的定時任務,例如每日備份或定時同步。多數 Web 框架都有內建的排程功能,底層通常仍由一個 cron 觸發。
雲端排程服務:如 Google Cloud Scheduler、AWS EventBridge Scheduler、Kubernetes CronJob,適合容器化或多台伺服器的架構,可以避免同一個任務在多台機器上重複執行,也方便設定時區與重試。
工作流引擎:如 Apache Airflow、Temporal、n8n,適合有先後順序、相依關係,需要重試與完整監控的任務鏈,例如「同步訂單完成後計算庫存,再產生報表」。

小型專案通常使用 cron 或框架內建排程就足夠。等到任務之間的相依關係變得複雜、需要視覺化的執行監控時,再考慮導入工作流引擎。

結語

排程任務看似簡單,實際上線後的問題多半不在「時間怎麼設定」,而在失敗告警、重疊執行、冪等性與時區這些細節。在系統規劃階段就把這些因素納入設計,自動化才能真正減少人力,而不是製造另一種需要人工追蹤的問題。

常見問題 FAQ

Q1. Cron Job 是什麼?
Cron Job 是在 Linux/Unix 系統上依照指定時間自動執行的排程任務,由背景的 cron 服務依照 crontab 設定定時觸發,常用於備份、資料同步與定期報表。

Q2. 排程任務和 Cron Job 是一樣的嗎?
排程任務是泛稱;Cron Job 是在 Linux 上使用 cron 工具實作的排程任務,是最經典的一種實作方式。

Q3. crontab 的 0 8 * * * 是什麼意思?
代表每天早上 8 點 0 分執行。五個欄位依序是分、時、日、月、星期,星號代表每一個。

Q4. 排程任務失敗了會自動通知嗎?
預設不會。需要自行設計執行日誌與失敗告警,或使用心跳監控,否則排程失敗可能長時間沒有被發現。

Q5. 為什麼排程會重複執行造成問題?
多半是上一次還沒執行完、下一次又啟動(重疊),或任務缺少冪等性設計。應加上鎖定機制避免重疊,並讓任務重複執行也不會產生錯誤。

Q6. 排程時間不準是什麼原因?
常見原因是伺服器時區與業務時區不一致。例如雲端伺服器預設使用 UTC,與台灣時間相差 8 小時。設定時應確認伺服器時區,或明確指定時區。

Q7. Cron 和 Airflow、n8n 差在哪?
Cron 適合簡單、彼此獨立的定時任務;Airflow、n8n 等工作流引擎適合有先後順序、相依關係、需要重試與監控的複雜任務鏈。小型專案通常使用 Cron 就足夠。

分享
FacebookLine
推薦