Cron Job 是在 Linux/Unix 系統上,依照指定時間自動執行的排程任務。系統中的 cron 服務會在背景持續運作,每分鐘檢查一次排程設定(crontab),時間一到就執行對應的指令或程式。每天凌晨備份資料庫、每小時同步訂單、每月初產生報表、定期清除過期的暫存檔,都是典型的 Cron Job。
「排程任務」是泛稱,Cron Job 是其中最經典的一種實作方式。以下說明 crontab 的寫法、企業系統常見的排程應用、設計排程時最容易遇到的問題,以及什麼時候該改用雲端排程或工作流引擎。
Cron 由兩個部分組成:負責計時與觸發的背景服務(cron daemon),以及記錄「什麼時間執行什麼指令」的設定檔 crontab。cron 服務會定期讀取 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 取得訂單、庫存與會員資料,保持各系統資料一致。跨系統同步的做法,可參考跨系統資料同步。
報表產生:每天或每月自動彙整營收、庫存與業績數據,寄送給管理者。
通知與提醒:到期提醒、續約通知、未完成簽核的催辦。
資料維護:資料庫備份、清除過期的暫存檔與日誌、封存舊資料。
狀態檢查:定期確認付款是否完成、物流狀態是否更新、外部服務是否正常。
cron 預設不會主動通知任務失敗。若沒有另外設計,排程可能已經默默失敗好幾天,直到有人發現資料沒有更新才察覺。每個重要的排程都應該記錄執行日誌,失敗時透過 Email、Slack 或 LINE 發送告警。
更進一步的做法是「心跳監控」:任務每次成功執行就回報一次,超過預期時間沒有回報就發出警示。這樣連排程根本沒有啟動的情況也能及時發現。系統告警的整合方式,可參考系統通知與內外部工具整合。
上一次的任務還沒跑完、下一次排程又啟動時,兩個任務可能同時處理同一批資料,造成重複寄信、重複扣款或資料錯亂。常見的解法是在執行前加上鎖定機制,例如 Linux 的 flock,或使用框架提供的防重疊功能,如 Laravel 排程的 withoutOverlapping()。
冪等性指的是同一個任務重複執行多次,結果都與執行一次相同。排程任務難免因為重試、手動補跑或重疊而重複執行,若每次都會重新寄送通知或新增一筆紀錄,就會產生錯誤。設計時應記錄每筆資料的處理狀態,已處理過的資料不再重複處理。
cron 依照伺服器的系統時區計算時間。許多雲端伺服器預設使用 UTC,與台灣時間相差 8 小時,設定「每天 8 點」實際上會在台灣時間下午 4 點執行。設定前應確認伺服器時區,或在排程工具中明確指定時區。
傳統 cron 不會補跑錯過的任務。伺服器若在排程時間剛好停機或重新啟動,那一次的任務就會直接跳過。
對於不能遺漏的作業,例如每日結帳或對帳,任務本身應該設計成「處理所有尚未處理的資料」,而不是只處理「今天」的資料。這樣即使錯過一次,下一次執行時也能自動補齊。
Cron 或框架內建排程:適合簡單、彼此獨立的定時任務,例如每日備份或定時同步。多數 Web 框架都有內建的排程功能,底層通常仍由一個 cron 觸發。
雲端排程服務:如 Google Cloud Scheduler、AWS EventBridge Scheduler、Kubernetes CronJob,適合容器化或多台伺服器的架構,可以避免同一個任務在多台機器上重複執行,也方便設定時區與重試。
工作流引擎:如 Apache Airflow、Temporal、n8n,適合有先後順序、相依關係,需要重試與完整監控的任務鏈,例如「同步訂單完成後計算庫存,再產生報表」。
小型專案通常使用 cron 或框架內建排程就足夠。等到任務之間的相依關係變得複雜、需要視覺化的執行監控時,再考慮導入工作流引擎。
排程任務看似簡單,實際上線後的問題多半不在「時間怎麼設定」,而在失敗告警、重疊執行、冪等性與時區這些細節。在系統規劃階段就把這些因素納入設計,自動化才能真正減少人力,而不是製造另一種需要人工追蹤的問題。
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 就足夠。