為什麼需要工作排程#

系統管理中有大量的重複性工作——日誌輪替、資料庫備份、暫存檔清理、安全掃描。這些工作不需要人手動執行,而應該由系統按時自動完成。Linux 提供了兩種排程機制來處理這個需求。

兩種排程類型#

atcrontab
執行次數一次性循環性
使用場景特定時間執行一次的任務需要定期重複的任務
服務名稱atdcrond

at:單次排程#

at 適合在特定時間點執行一次的任務。例如:凌晨三點重啟服務、明天下午五點發送報告。

存取控制#

  • /etc/at.allow:白名單,只有列在這裡的使用者能使用 at
  • /etc/at.deny:黑名單,列在這裡的使用者不能使用 at

如果兩個檔案都不存在,則只有 root 能使用 at。

batch:系統閒置時執行#

batchat 的變體——它不在指定時間執行,而是等到系統負載低於特定值時才執行。適合不緊急但消耗資源的任務。

crontab:循環排程#

crontab 是 Linux 工作排程的核心。系統管理的自動化幾乎都仰賴它。

使用者層級的 crontab#

每個使用者可以用 crontab -e 編輯自己的排程。格式為六個欄位:

分 時 日 月 週 指令

每個時間欄位可以使用:

  • *:任意值
  • ,:列舉多個值(如 1,15
  • -:範圍(如 1-5
  • /:間隔(如 */5 表示每 5 單位)

「日」和「週」不要同時指定。 crontab 中的「日」和「週」是的關係,不是「且」。如果同時寫了「每月 15 日」和「每週一」,結果是「每月 15 日每週一」都會執行,而不是「15 日且是週一」才執行。

系統層級的 crontab#

  • /etc/crontab:系統全域排程,格式多一個「執行身份」欄位
  • /etc/cron.d/:各軟體的排程設定
  • /etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/:將 script 放入對應目錄即可

實務注意事項#

  • 輸出重導向:crontab 的指令如果產生 stdout,會透過郵件發送。大量排程可能導致信箱爆滿。建議將輸出導向 log 或 /dev/null
  • 環境變數:crontab 的執行環境非常精簡,$PATH 可能與你的 Shell 不同。建議在指令中使用絕對路徑
  • 資源分散:避免所有排程都設在整點(如 0 * * * *),錯開時間以分散系統負載

一個常見的除錯問題:「crontab 的指令手動執行正常,但排程執行時卻失敗」。原因幾乎都是環境差異——crontab 的 PATH、語系、工作目錄與你的互動 Shell 不同。在 script 開頭明確設定 PATHcd 到正確目錄,可以避免大部分問題。

anacron:補漏機制#

cron 有一個限制——如果排程的執行時間到了但系統是關機狀態,這次排程就會被跳過。anacron 的設計就是為了解決這個問題。

anacron 的運作邏輯:

  1. 記錄每個工作最後執行的時間戳
  2. 開機時檢查是否有超過指定天數未執行的工作
  3. 如果有,延遲一段時間後補執行

anacron 不是 cron 的替代品,而是補充。在 CentOS 7 中,anacron 已經整合進 crond 服務中。它主要用來確保 /etc/cron.daily/ 等目錄中的系統維護工作(如日誌輪替、資料庫更新)不會因為關機而被永久跳過。

系統常見的例行性工作#

Linux 系統預設就有許多自動排程:

  • logrotate:日誌檔案輪替,避免 log 無限增長
  • locate 資料庫更新:更新 locate 指令使用的檔案資料庫
  • man page 資料庫更新:建立 man -k 搜尋用的索引
  • 暫存檔清理:清除 /tmp 中過期的暫存檔案
  • RPM 資料庫維護:維護軟體套件資料庫的一致性