2011年2月21日 星期一

Fedora 下排程指令(轉貼)

轉貼自:第十六章、例行性工作排程 (crontab)
系統的設定檔: /etc/crontab

這個『 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 的設定就自動的會來執行了!
Tips:
在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啟動 crond 這個服務吧!『/etc/init.d/crond restart』 鳥哥的圖示

廢話少說,我們就來看一下這個 /etc/crontab 的內容吧!

[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 號
分 時 日 月 週 執行者身份 指令串

看到這個檔案的內容你大概就瞭解了吧!呵呵,沒錯!這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣!只是有幾個地方不太相同:

* 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 等等的任務嘛!

由於 CentOS 提供的 run-parts 這個 script 的輔助,因此 /etc/crontab 這個檔案裡面支援兩種下達指令的方式, 一種是直接下達指令,一種則是以目錄來規劃,例如:

* 指令型態
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 這個使用者的身份,在每小時執行一次 mail 指令。

* 目錄規劃
*/5 * * * * root run-parts /root/runcron
建立一個 /root/runcron 的目錄,將要每隔五分鐘執行的『可執行檔』都寫到該目錄下, 就可以讓系統每五分鐘執行一次該目錄下的所有可執行檔。

好!你現在大概瞭解了這一個咚咚吧!OK!假設你現在要作一個目錄,讓系統可以每 2 分鐘去執行這個目錄下的所有可以執行的檔案,你可以寫下如下的這一行在 /etc/crontab 中:

*/2 * * * * root run-parts /etc/cron.min

當然囉, /etc/cron.min 這個目錄是需要存在的喔!那如果我需要執行的是一個『程式』而已, 不需要用到一個目錄呢?該如何是好?例如在偵測網路流量時,我們希望每五分鐘偵測分析一次, 可以這樣寫:

*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg

如何!建立例行性命令很簡單吧!如果你是系統管理員而且你的工作又是系統維護方面的例行任務時, 直接修改 /etc/crontab 這個檔案即可喔!又便利,又方便管理呢!

沒有留言: