天天看點

第5章 腳本控制------------------------(at指令、mail指令、batch指令、cron表格、anacron表格)

5.5  定時運作腳本

         在處理腳本時,總會遇到需要在給定時間運作腳本。Linux系統提供3中方式在預定時間運作腳本:at指令、batch指令、cron表格。每種方法使用不同的技術排程運作腳本的時間和頻率。

5.5.1使用at指令排程作業

         at指令允許指定Linux系統運作腳本的時間。at指令将作業送出到一個隊列,并訓示shell在何時運作該作業。另一個指令atd以背景模式運作,并檢查作業隊列以運作作業。大部分Linux發行版都可以在啟動時自動啟動該特性。

         atd指令檢查系統上的特殊目錄,以便運作使用at指令送出的作業。預設情況下,atd指令每隔60秒檢查一次該目錄。如果存在作業,atd指令檢查運作作業的時間。如果時間與目前時間比對,則atd指令将運作該作業。

        1.at指令格式

         at指令的基本格式很簡單:at [-f filename] time。預設情況下,at指令将STDIN的輸入送出到隊列。可以使用-f參數指定用于讀取指令的的檔案名(腳本參數)。

         time參數指定Linux系統運作作業的時間。at指令可以識别各種時間格式:

l  标準的小時和分鐘格式,比如10:15

l  AM/PM訓示符,比如10:15PM

l  具體指定的時間,比如now、noon、midnight、teatime(4PM)

         如果指定一個已經過去的時間,at指令将在第二天的那個時間運作作業。

         除了指定運作作業的時間之外,還可以包括具體的日期,可以使用各種格式的日期:

l  标準的日期格式,比如:MMDDYY、MM/DD/YY、DD.MM.YY

l  文本日期格式,比如Jul4、Dec 25,沒有年份也可以

l  還可以指定時間增量:Now +25 minutes、10:15PM tomorrow、10:15 +7days

         使用at指令時,作業将送出到作業隊列中。作業隊列儲存at指令送出的作業以便處理。有26種不同的作業對壘可用于不同的優先級水準。使用小寫字母a到z引用作業隊列。預設情況下,所有的at作業都送出到作業隊列a,即優先級最高的隊列。如果希望以較低的優先級運作作業,則可以使用-q參數指定字母。

         2.擷取作業輸出

         作業在Linux系統運作時,沒有與該作業關聯的螢幕。Linux使用送出作業的使用者的電子郵箱位址作為STDOUT和STDERR。任何以STDOUT和STDERR為目的的輸出都将通過郵件系統發送給使用者。

         如果系統沒有安裝at、mail指令使用指令:sudoapt-get install at、sudo apt-get install mail。進行安裝。

         以下是使用at指令排程作業運作的一個簡單示例:

第5章 腳本控制------------------------(at指令、mail指令、batch指令、cron表格、anacron表格)

         at指令生成一個警告消息,指出系統使用什麼shell運作腳本(預設shell配置設定給/bin/sh,對于Linux就是bash shell),配置設定給作業的作業編号以及作業計劃運作的時間。

         作業完成時,螢幕上不會顯示任何内容,但是系統将生成一個電子郵件消息。電子郵件消息顯示腳本生成的輸出。如果腳本沒有生成輸出,則預設情況下不會生成電子郵件消息。可以使用at指令的-m選項更改特性。在腳本沒有生成任何輸出的情況下,該選項可以生成一個電子郵件消息,訓示作業已完成。

第5章 腳本控制------------------------(at指令、mail指令、batch指令、cron表格、anacron表格)

         通過上圖可知道,列出排隊的作業的指令格式:atq  [-V] [-q queue]。

移除指令格式:atrm [-V] job [job...] 或at [-rd] job [job...]。job代表job編号。​

5.5.2使用batch指令調

         batch指令的作用不是安排腳本在預設的時間運作,而是安排腳本在系統使用率低時運作。如果Linux系統正處于高負載水準,batch指令将延遲送出作業,知道系統負載降低為止。

         batch指令檢查Linux系統目前的平均負載水準。如果水準低于1.5或低于atd指令中指定的值,它将運作任何在作業隊列中等待的作業。batch指令的指令格式如下:

batch[-f filename] [time]。預設情況下batch指令從STDIN讀取指令,可以使用-f參數指定讀取指令檔案。還可以指定batch指令應該運作作業的最早時間。

         本人下載下傳這個版本,batch不帶有參數,隻能從STDIN讀取指令。

5.5.3 調用定期腳本

         Linux系統使用cron程式排程需定期運作的job。corn程式在背景運作,它從特殊表格(corn表格)中查找需要排程運作的作業。

         1.cron表格

         cron表格使用特殊格式指定作業運作時間。cron表格的格式如下:

         min  hour  dayofmonth  month  dayofweek  command

         cron表格可以将條目指定為具體的值、一定範圍的值(如 1-5)或通配符(*)。例如,如果希望每天10:15運作指令,可以使用以下corn表格項:15 10 * * * command。

         dayofweek項可以是3字元的文本值(mon、tue、wed、thu、fri、sat、sun),也可以是數字:0辨別星期天,6表示星期六。

         dayofmonth項指定每個月的日期值(1-31)。

         PS:因為每個月份不同,是以如何設定一個指令在每個月的最後一天執行呢?一種常用的方法是添加:if-then語句,該語句使用date指令檢查明天是否是1号:

         00 12 * * * if [ `date +%d -d tomorrow` =01  ] ;  then ; command

         通過if判斷明天是否為01,如果是則執行指令。這将在每天的12點檢視本日是否是該月的最後一天,如果是,它将運作指令。

        指令清單必須制定要運作的指令或shell腳本的完整路徑名。可以根據需要添加任何指令行參數或者重定向符号。  

         cron程式使用送出作業的使用者賬戶運作腳本。是以必須擁有相應的權限才能通路指令行清單中的指定的指令和輸出檔案。

         2.建構cron表格

         每個系統使用者都可以擁有自己的cron表格以及運作安排好的作業。Linux提供crontab指令處理cron表格。要列出現有的cron表格,使用-l參數。

第5章 腳本控制------------------------(at指令、mail指令、batch指令、cron表格、anacron表格)

         預設情況下,每個使用者的cron表格檔案都不存在。要向cron表格添加條目,可以使用-e參數。這樣做時,crontab指令自動啟動vi編譯器處理向右的cron表格(如果沒有,則建立一個空檔案)。

    cron的操作執行個體如下:

         使用crontab -e指令,如果沒有建立,會提示選擇相應的編輯工具,然後進入檔案,添加corn表格格式的資訊檔案!然後儲存退出,到達指定時間郵箱會收到消息提醒。

第5章 腳本控制------------------------(at指令、mail指令、batch指令、cron表格、anacron表格)

         3.anacron程式

         使用cron程式存在的唯一一個問題是,它假定Linux系統每天運作24小時,每周運作7天。隻有在伺服器環境中運作Linux時才能發生這種情況。

         如果在使用cron程式排程作業時Linux系統處于關閉狀态,則作業将無法運作。cron程式無法再系統打開後重新運作錯過的作業。

         anacron程式使用時間戳确定排程的作業是否在正确的時間間隔運作。如果它确定某個作業錯過了排程的運作時間,它将自動盡快的運作該作業。

         該特性對于執行日志維護的腳本非常有用。如果系統在應該運作腳本時總是關機,則日志檔案将得不到清理,檔案大小可能會不斷增大。使用anacron可以保證日志檔案至少在每次系統啟動的時清理一次。

         anacron程式使用自己的表格(通常位于/etc/anacrontab)指定作業。在大部分Linux發行版本,該表格僅供根使用者使用。anacron表格的格式:period delay identifiercommand

period項定義作業應該間隔多久運作一次,一天為機關。delay項指定在anacron程式确定應該運作一個指令之後需要多長時間才會實際運作該指令。該選項可以為不同的指令設定不同的延時,以防止所有指令在一打開Linux系統時運作。

         identifier項是一個唯一的非空字元串,可以唯一地辨別日志消息和錯誤電子郵件中的作業。