第 28章 自動工作排程管理

在 Linux 中,可以設定系統的工作在一個指定的時間、日期或當系統平均負載低於指定的數據時自動執行。 Red Hat Linux 已預先設定好執行重要的系統工作以保持系統的更新,例如由 locate 指令使用的 slocate 資料庫是每日更新的。 系統管理員可以使用自動的工作管理來執行定期的備份、監視系統與執行自訂的程式碼等等。

Red Hat Linux 中含有四個自動工作管理程式: cronanacronat 以及 batch

28.1. Cron

Cron 是一種系統程式(daemon),它可以依據所設定的時間、日期、月份、星期幾以及星期的結合來排程重覆性工作的執行。

Cron 假設系統是在持續開機的情況下,假如在工作排定的時間,系統沒有開機,該工作將不會被執行。 如要以時間的週期而不是確切的時間來設定工作的話,請參考 菴 28.2 節。 如要排定僅執行一次的工作,請參考 菴 28.3 節

如要使用 cron 的服務,您必須要安裝 vixie-cron RPM 套件,而且 crond 的服務必須在執行中。 要查看該套件是否已安裝,請使用 rpm -q vixie-cron 指令; 要查看服務是否在執行中,請使用 /sbin/service crond status 指令。

28.1.1. 設定 Cron 的工作排程

cron 的主要設定檔案 /etc/crontab 包含了以下這幾行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

一開始的四行是使用來設定 cron 工作要執行之環境的變數,例如 SHELL 變數的值將告訴系統要使用那一個 shell 環境(在此為 bash shell),而 PATH 變數則定義要用來執行指令的路徑。 cron 工作的輸出將會以電子郵件寄到 MAILTO 變數所定義的使用者名稱,假如 MAILTO 變數定義為一個空的字串 (MAILTO=""),將不會傳送任何的電子郵件。 HOME 變數可用來設定執行指令或程式碼時要使用的家目錄。

/etc/crontab 檔案中的每一行都代表一項工作,而且都有相同的格式:

分   時   日期   月份   星期幾   指令

  • — 從 0 到 59 的任何整數

  • — 從 0 到 23 的任何整數

  • 日期 — 從 1 到 31 的任何整數(假如有指定月份的話,必須是一個有效的日期)

  • 月份 — 從 1 到 12 的任何整數(或者是月份名稱的縮寫,如 jan、feb 等等)

  • 星期幾 — 從 0 到 7 的任何整數,0 或 7 代表星期日(或者是縮寫名稱,如 sun、mon 等等)

  • 指令 — 要執行的指令(這裡的指令可以是一個例如 ls /proc >> /tmp/proc 的指令或用來執行您所撰寫之程式碼的指令。)

對於以上的任何數值,可以使用一個星號(*)來指定所有有效的數值,例如在月份的一個星號代表在其他數值的範圍內每月執行該指令。

整數之間的一個引號(-)代表整數的一個範圍,例如 1-4 代表整數 1, 2, 3 與 4。

以逗號(,)分隔開的一系列數值代表一個清單,例如 3, 4, 6, 8 代表這四個特定的整數。

斜線符號(/)用來代表時間間隔的數值,只要在一個數值範圍之後加上 /<整數> 即可在該範圍內跳過該整數所指定的數值,例如 0-59/2 在分鐘的欄位中可用來定義每隔兩分鐘執行一次工作。 間隔的數值也可以使用一個星號,如在月份欄位的數值 */3 可以使用來每三個月執行一次工作。

任何以井號(#)開頭的行都是註解,並且都不會被執行。

如您所看到的 /etc/crontab 檔案,它使用 run-parts 程式碼來分別執行 /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly/etc/cron.monthly 目錄中以每小時、每天、每星期或每月為基礎的程式碼。 這些目錄中的檔案應該都是 shell 程式碼。

假如一個 cron 的工作需要在預計的時間執行,而不是以每小時、每天、每星期或每月為基礎,可以將它增加至 /etc/cron.d 目錄中,在這個目錄中的所有檔案都使用與 /etc/crontab 檔案中相同的語法,請參考 範例 28-1 以取得相關範例。

# record the memory usage of the system every monday 
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

範例 28-1. Crontab 的範例

root 之外的使用者可以使用 crontab 工具來設定 cron 的工作,所有使用者定義的 crontabs 都儲存在 /var/spool/cron 目錄中,並且由建立它們的使用者之使用者名稱來執行。 如要以一個使用者來建立一個 crontab,請以該使用者登入並輸入 crontab -e 指令以使用 VISUALEDITOR 環境變數所指定的編輯器來編輯使用者的 crontab。 這個檔案使用與 /etc/crontab 檔案相同的格式。 在儲存 crontab 所作的變更後,該 crontab 會依據使用者名稱儲存起來,並寫入到 /var/spool/cron/username 檔案中。

cron 系統程式會在每一分鐘檢查 /etc/crontab 檔案、/etc/cron.d//var/spool/cron 目錄是否有任何的變更,假如有任何的變更,它們將會被載入記憶體。 因此如果在 crontab 檔案更改後,並不需要重新啟動這個系統程式。

28.1.2. Cron 的存取控制

/etc/cron.allow/etc/cron.deny 檔案是用來限制使用者對 cron 的存取權限。 這兩個存取控制檔案的格式是在每一行放置一個使用者名稱,兩個檔案中都不允許有空白字元。 假如在修改存取控制檔案後,並不需要重新啟動 cron 系統程式 (crond),這些存取控制檔案將在使用者試著要增加或刪除一個 cron 工作時被讀取。

root 使用者隨時都可以使用 cron,不管使用者的名稱是否有列在存取控制檔案中。

假如 cron.allow 檔案存在的話,只有在其中列出的使用者允許使用 cron,而 cron.deny 檔案便會被忽略。

假如 cron.allow 檔案不存在的話,所有在 cron.deny 檔案中列出的使用者都不允許使用 cron。

28.1.3. 啟動與停止服務

如要啟動 cron 服務,請使用 /sbin/service crond start 指令。 如要停止這項服務,您可以使用 /sbin/service crond stop 指令。 在此建議您在系統開機便啟動這項服務,請參考 第14章 以取得關於在開機時自動啟動 cron 服務的細節。