2013年2月26日星期二

linux系統的設定檔: /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 這個檔案即可喔!又便利,又方便管理呢!

小標題的圖示一些注意事項
有的時候,我們以系統的 cron 來進行例行性工作的建立時,要注意一些使用方面的特性。 舉例來說,如果我們有四個工作都是五分鐘要進行一次的,那麼是否這四個動作全部都在同一個時間點進行? 如果同時進行,該四個動作又很耗系統資源,如此一來,每五分鐘不是會讓系統忙得要死? 呵呵!此時好好的分配一些執行時間就 OK 啦!所以,注意一下:

没有评论:

发表评论