這個『 crontab -e 』是針對使用者的 cron 來設計的,如果是『系統的例行性任務』時, 該怎麼辦呢?是否還是需要以 crontab -e 來管理你的例行性工作排程呢?當然不需要,你只要編輯 /etc/crontab這個檔案就可以啦!有一點需要特別注意喔!那就是 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個執行檔,但是 /etc/crontab 可是一個『純文字檔』喔!你可以 root 的身份編輯一下這個檔案哩!
基本上, cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容 』,因此,只要你編輯完 /etc/crontab 這個檔案,並且將他儲存之後,那麼 cron 的設定就自動的會來執行了!
廢話少說,我們就來看一下這個 /etc/crontab 的內容吧!
看到這個檔案的內容你大概就瞭解了吧!呵呵,沒錯!這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣!只是有幾個地方不太相同:
基本上, cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容 』,因此,只要你編輯完 /etc/crontab 這個檔案,並且將他儲存之後,那麼 cron 的設定就自動的會來執行了!
Tips: 在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啟動 crond 這個服務吧!『/etc/init.d/crond restart』 |
[root@www ~]# cat /etc/crontab SHELL=/bin/bash <==使用哪種 shell 介面 PATH=/sbin:/bin:/usr/sbin:/usr/bin <==執行檔搜尋路徑 MAILTO=root <==若有額外STDOUT,以 email將資料送給誰 HOME=/ <==預設此 shell 的家目錄所在 # 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 <==每個月 1 號 分 時 日 月 週 執行者身份 指令串 |
- MAILTO=root:
這個項目是說,當 /etc/crontab 這個檔案中的例行性工作的指令發生錯誤時,或者是該工作的執行結果有 STDOUT/STDERR 時,會將錯誤訊息或者是螢幕顯示的訊息傳給誰?預設當然是由系統直接寄發一封 mail 給 root 啦!不過, 由於 root 並無法在用戶端中以 POP3 之類的軟體收信,因此,鳥哥通常都將這個 e-mail 改成自己的帳號,好讓我隨時瞭解系統的狀況!例如: MAILTO=dmtsai@my.host.name - PATH=....:
還記得我們在第十一章的 BASH 當中一直提到的執行檔路徑問題吧! 沒錯啦!這裡就是輸入執行檔的搜尋路徑!使用預設的路徑設定就已經很足夠了! - 01 * * * * root run-parts /etc/cron.hourly:
這個 /etc/crontab 裡面預設定義出四項工作任務,分別是每小時、每天、每週及每個月分別進行一次的工作! 但是在五個欄位後面接的並不是指令,而是一個新的欄位,那就是『執行後面那串指令的身份』為何!這與使用者的 crontab -e 不相同。由於使用者自己的 crontab 並不需要指定身份,但 /etc/crontab 裡面當然要指定身份啦!以上表的內容來說,系統預設的例行性工作是以 root 的身份來進行的。
那麼後面那串指令是什麼呢?你可以使用『 which run-parts 』搜尋看看,其實那是一個 bash script 啦!如果你直接進入 /usr/bin/run-parts 去看看, 會發現這支指令會將後面接的『目錄』內的所有檔案捉出來執行!這也就是說『 如果你想讓系統每小時主動幫你執行某個指令,將該指令寫成 script,並將該檔案放置到 /etc/cron.hourly/ 目錄下即可』的意思!
現在你知道系統是如何進行他預設的一堆例行性工作排程了嗎?如果你下達『 ll /etc/cron.daily 』就可以看到一堆檔案, 那些檔案就是系統提供的 script ,而這堆 scripts 將會在每天的凌晨 4:02 開始運作!這也是為啥如果你是夜貓族, 就會發現奇怪的是,Linux 系統為何早上 4:02 開始會很忙碌的發出一些硬碟跑動的聲音!因為他必須要進行 makewhatis, updatedb, rpm rebuild 等等的任務嘛!
- 指令型態
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 這個使用者的身份,在每小時執行一次 mail 指令。 - 目錄規劃
*/5 * * * * root run-parts /root/runcron
建立一個 /root/runcron 的目錄,將要每隔五分鐘執行的『可執行檔』都寫到該目錄下, 就可以讓系統每五分鐘執行一次該目錄下的所有可執行檔。
*/2 * * * * root run-parts /etc/cron.min當然囉, /etc/cron.min 這個目錄是需要存在的喔!那如果我需要執行的是一個『程式』而已, 不需要用到一個目錄呢?該如何是好?例如在偵測網路流量時,我們希望每五分鐘偵測分析一次, 可以這樣寫:
*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg如何!建立例行性命令很簡單吧!如果你是系統管理員而且你的工作又是系統維護方面的例行任務時, 直接修改 /etc/crontab 這個檔案即可喔!又便利,又方便管理呢!
一些注意事項
有的時候,我們以系統的 cron 來進行例行性工作的建立時,要注意一些使用方面的特性。 舉例來說,如果我們有四個工作都是五分鐘要進行一次的,那麼是否這四個動作全部都在同一個時間點進行? 如果同時進行,該四個動作又很耗系統資源,如此一來,每五分鐘不是會讓系統忙得要死? 呵呵!此時好好的分配一些執行時間就 OK 啦!所以,注意一下: