在 Linux 中,可以設定系統的工作在一個指定的時間、日期或當系統平均負載低於指定的數據時自動執行。 Red Hat Linux 已預先設定好執行重要的系統工作以保持系統的更新,例如由 locate 指令使用的 slocate 資料庫是每日更新的。 系統管理員可以使用自動的工作管理來執行定期的備份、監視系統與執行自訂的程式碼等等。
Red Hat Linux 中含有四個自動工作管理程式: cron、anacron、at 以及 batch。
Cron 是一種系統程式(daemon),它可以依據所設定的時間、日期、月份、星期幾以及星期的結合來排程重覆性工作的執行。
Cron 假設系統是在持續開機的情況下,假如在工作排定的時間,系統沒有開機,該工作將不會被執行。 如要以時間的週期而不是確切的時間來設定工作的話,請參考 菴 28.2 節。 如要排定僅執行一次的工作,請參考 菴 28.3 節。
如要使用 cron 的服務,您必須要安裝 vixie-cron RPM 套件,而且 crond 的服務必須在執行中。 要查看該套件是否已安裝,請使用 rpm -q vixie-cron 指令; 要查看服務是否在執行中,請使用 /sbin/service crond status 指令。
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 指令以使用 VISUAL 或 EDITOR 環境變數所指定的編輯器來編輯使用者的 crontab。 這個檔案使用與 /etc/crontab 檔案相同的格式。 在儲存 crontab 所作的變更後,該 crontab 會依據使用者名稱儲存起來,並寫入到 /var/spool/cron/username 檔案中。
cron 系統程式會在每一分鐘檢查 /etc/crontab 檔案、/etc/cron.d/ 與 /var/spool/cron 目錄是否有任何的變更,假如有任何的變更,它們將會被載入記憶體。 因此如果在 crontab 檔案更改後,並不需要重新啟動這個系統程式。
/etc/cron.allow 與 /etc/cron.deny 檔案是用來限制使用者對 cron 的存取權限。 這兩個存取控制檔案的格式是在每一行放置一個使用者名稱,兩個檔案中都不允許有空白字元。 假如在修改存取控制檔案後,並不需要重新啟動 cron 系統程式 (crond),這些存取控制檔案將在使用者試著要增加或刪除一個 cron 工作時被讀取。
root 使用者隨時都可以使用 cron,不管使用者的名稱是否有列在存取控制檔案中。
假如 cron.allow 檔案存在的話,只有在其中列出的使用者允許使用 cron,而 cron.deny 檔案便會被忽略。
假如 cron.allow 檔案不存在的話,所有在 cron.deny 檔案中列出的使用者都不允許使用 cron。
如要啟動 cron 服務,請使用 /sbin/service crond start 指令。 如要停止這項服務,您可以使用 /sbin/service crond stop 指令。 在此建議您在系統開機便啟動這項服務,請參考 第14章 以取得關於在開機時自動啟動 cron 服務的細節。