為什麼需要工作排程#
系統管理中有大量的重複性工作——日誌輪替、資料庫備份、暫存檔清理、安全掃描。這些工作不需要人手動執行,而應該由系統按時自動完成。Linux 提供了兩種排程機制來處理這個需求。
兩種排程類型#
| at | crontab | |
|---|---|---|
| 執行次數 | 一次性 | 循環性 |
| 使用場景 | 特定時間執行一次的任務 | 需要定期重複的任務 |
| 服務名稱 | atd | crond |
at:單次排程#
at 適合在特定時間點執行一次的任務。例如:凌晨三點重啟服務、明天下午五點發送報告。
存取控制#
/etc/at.allow:白名單,只有列在這裡的使用者能使用 at/etc/at.deny:黑名單,列在這裡的使用者不能使用 at
如果兩個檔案都不存在,則只有 root 能使用 at。
batch:系統閒置時執行#
batch 是 at 的變體——它不在指定時間執行,而是等到系統負載低於特定值時才執行。適合不緊急但消耗資源的任務。
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 開頭明確設定PATH和cd到正確目錄,可以避免大部分問題。
anacron:補漏機制#
cron 有一個限制——如果排程的執行時間到了但系統是關機狀態,這次排程就會被跳過。anacron 的設計就是為了解決這個問題。
anacron 的運作邏輯:
- 記錄每個工作最後執行的時間戳
- 開機時檢查是否有超過指定天數未執行的工作
- 如果有,延遲一段時間後補執行
anacron 不是 cron 的替代品,而是補充。在 CentOS 7 中,anacron 已經整合進 crond 服務中。它主要用來確保
/etc/cron.daily/等目錄中的系統維護工作(如日誌輪替、資料庫更新)不會因為關機而被永久跳過。
系統常見的例行性工作#
Linux 系統預設就有許多自動排程:
- logrotate:日誌檔案輪替,避免 log 無限增長
- locate 資料庫更新:更新
locate指令使用的檔案資料庫 - man page 資料庫更新:建立
man -k搜尋用的索引 - 暫存檔清理:清除
/tmp中過期的暫存檔案 - RPM 資料庫維護:維護軟體套件資料庫的一致性