LINUX中的週期性進程cron原理及使用詳解

            在LINUX中,週期執行的任務一般由cron這個守護進程來處理。cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。cron的配置文件稱爲“crontab”,是“cron table”的簡寫。
一,cron在3個地方查找配置文件:
    1,/var/spool/cron/ 這個目錄下存放的是每個用戶包括root的crontab任務,每個任務以創建者的名字命名,比如tom建的crontab任務對應的文件就是/var/spool/cron/tom。一般一個用戶最多隻有一個crontab文件。(對於不同的LINUX系統,目錄的位置可能不太一樣,這裏我是以REDHAT 5.1爲例)
    2,/etc/crontab 這個文件負責安排由系統管理員制定的維護系統以及其他任務的crontab。它的文件格式與用戶自己創建的crontab不太一樣。格式如下:
           第一部分定義的是環境,第二部分定義的是每小時,每天,每週,每個月要自動執行的任務,它的格式是:
           分 時 日 月 周 [用戶] 命令 (具體後面再講)
           這個地方比較特殊,它後面接的是目錄名稱,之所以這麼做是爲了方便管理。也就是說,你可以把要每天執行的腳本放在/etc/cron.dail/目錄下,每月要執行的腳本放在/etc/cron.monthly/下。
      3,/etc/cron.d/ 這個目錄用來存放任何要執行的crontab文件或腳本。
      一旦cron進程啓動,它就會讀取配置文件,並將其保存在內存中,接着自己轉入到休眠狀態。以後每分鐘會醒來一次檢查配置文件,讀取修改過的,並執行爲這一刻安排的任務,然後再轉入休眠。
 
二,crontab格式
       分 時 日 月 周 [用戶] 命令
     前6個字段用空格隔開,命令中如果有空格按原意對待。“用戶”字段只出現在/etc/crontab文件和/etc/cron.d目錄下的文件裏,它指出命令以哪個用戶的身份運行。這個字段沒必要寫在用戶自定義的crontab文件(/var/spool/cron/)中。
      定義的範圍:
                        分  0--59
                        時  0--23
                        日  1--31
                        月  1--12
                        周  0--6
                *   表示所有都匹配
                */n   表示每個n長時間重複一次
                x,y    表示每到x,每到y時執行
                k-m   表示在k和m之間執行
 
咱們來看幾個例子
        */5  *  *  *  *  ls /tmp >> /tmp/123
        每隔5分鐘,將/tmp目錄中的文件名重定向(追加)到/tmp/123文件中
        1  0-3  *  *  *  (cd /home/tom ;make)
         每天凌晨的12點到3點過一分時,在/home/tom目錄下運行make命令
        0,30   *   13   *   5  mail -s Reminder evi@anchor  % Don't forget to write your chapters.
         這是一個比較經典的例子。首先,它並不是表示執行的時間是周5恰好13號,這是很多人容易犯錯誤的地方。它表示的是周5或者每月13號。如果同時指定了“日”和“周”,那麼滿足兩個條件之一的執行。
         後面的命令表示發一份郵件,郵件的內容是“%”後的內容。“%”後的內容只是前面命令的標準輸出。  
 
三,cron的使用和管理
        1,  crontab 文件名    
        將文件安裝爲crontab,它將替換crontab文件任何以前的版本。這個文件要事先手動建立,並且嚴格按照crontab的格式。例如:
# vim /tmp/123
* * * * * ls >> /tmp/ls
# crontab /tmp/123
       
       2,   crontab
        直接編輯crontab,但每次只能做一條計劃任務。下次再使用時上一次的自動被覆蓋。一般情況下用得比較少。
 
        3,crontab -e
         使用這種方法時,cron會調用vi編輯器,相對於方法2可以寫多條計劃任務。每行一條。
 
         其他:
         crontab -l  查看任務
         crontab -r   刪除任務
         對於普通用戶而言,每個用戶自己定義的crontab只有用戶自己能看到。當然root例外。如果root想刪除普通用戶的crontab任務,可以用
         crontab -u 用戶名 -r
 
          關於使用crontab的限制
          利用/etc/cron.allow(以下簡稱A)和/etc/cron.deny(以下簡稱B)這兩個文件可以指定哪些用戶可以提交crontab文件。
          當A,B都不存在時,只用root可以建crontab任務。
          當僅A存在時,A中定義的用戶才能建任務。格式爲每行一個用戶。
          當僅B存在時,B中定義的用戶不能建任務,其他用戶都可以。格式和A一樣,每行一個用戶。
           當A,B都存在時,忽略B中的定義。
 
           值得注意的是,在一個網絡中,有時候cron會導致輕微且重複的震盪,這是因爲管理員配置的cron正好在同一時間多臺機器上運行,如果使用NTP問題可能會惡化。所以最好制定任務時把時間錯開一下。
 
四,最後,不得不說的問題
        制定好crontab後,系統會自動執行管理員預先制定好的任務。但是,如果系統當機了,或者因爲其他原因錯過了任務執行的時間怎麼辦呢?
        這個時候,咱們就得依賴anacron了。默認情況下RHEL5已經安裝了此服務。
        anacron只管多長時間(按天計算)執行一次任務就OK,對於具體時間則沒有要求。它的配置文件是/etc/anacrontab
 
和/etc/crontab類似,第一部分定義了環境。第二部分後半部分也和/etc/crontab相似,就不再重複。前半部分中第一字段定義的是天數(這個地方是1,7,30),第二字段定義延時多長分鐘(這裏是65,70和75)。
 
對於 1       65      cron.daily              run-parts /etc/cron.daily
表示的意思就是:嘗試一天,每65分鐘再嘗試執行/etc/cron.daily中定義的任務。
 
這樣一來,就解決了過期未執行crontab的問題
 
           
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章