1. 程式人生 > >Linux命令crontab定時計劃學習

Linux命令crontab定時計劃學習

在linux裡面當我們有一個週期性的任務需要執行的時候,crontab可以給我們提供一個很好的幫助, 我們可以在固定的間隔時間執行指定的系統指令或 shell script指令碼。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。

1. 它的命令格式是

crontab [-u user] file 
crontab [-u user][ -e | -l | -r ]

2. 命令選項

crontab命令選項:

     file file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入crontab。如果在命令列中沒有指定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab
     -u 指定一個使用者
-l 列出某個使用者的任務計劃 -r 刪除某個使用者的任務 -e 編輯某個使用者的任務 -i 在刪除使用者的crontab檔案時給確認提示。

3. 取值範圍

命令 解釋
* * * * * command
0-59 0-23 1-31 1-12 0-7 command 周的0和7為星期日

記住幾個特殊符號的含義:

     "*"代表取值範圍內的數字
     "/"代表”每”
     "-"代表從某個數字到某個數字
     ","分開幾個離散的數字

4. 舉例如下

命令 解釋
* * * * * ls
5 * * * * /usr/bin/ls 每小時的第五分鐘執行ls命令
30 5 * * * /usr/bin/ls 每天的5:30執行ls命令
30 5 7 * * /usr/bin/ls 每月7號的5:30執行ls命令
30 5 7 8 * /usr/bin/ls 每年8月7號的5:30執行ls命令
30 5 * * 0 /usr/bin/ls 每週週日5:30執行ls命令
6,8 5 * * * /usr/bin/ls 每小時的第六第八分鐘執行ls命令
8 5,6 * * * /usr/bin/ls 每天的第五第六個小時的第八分鐘執行ls命令
8 6 * * 1,2 /usr/bin/ls 每週的星期一二的第6個小時第8分鐘執行ls命令
*/5 * * * * /usr/bin/ls 每五分鐘執行一次ls命令
* * */2 * * /usr/bin/ls 每兩天執行一次ls命令
25 8-9 * * * /usr/bin/ls 每天8點到9點的第25分鐘執行ls命令
*/25 * * * 3 /usr/bin/ls 每週三的當天每隔25分鐘執行一次ls命令
* 22-7/1 * * * /usr/bin/ls 晚上11點到早上7點之間每隔一個小時執行一次ls命令

注意:

(1)每條任務排程執行完畢,系統都會將任務輸出資訊通過電子郵件的形式傳送給當前系統使用者,這樣日積月累,日誌資訊會非常大,可能會影響系統的正常執行(郵件過多造成inode被消耗過多導致磁碟空間很多但是實際用不了),因此,將每條任務進行重定向處理非常重要。 例如,可以在crontab檔案中設定如下形式,忽略日誌輸出

0 */3 * * * /command >/dev/null 2>&1

(2)系統級任務排程主要完成系統的一些維護操作,使用者級任務排程主要完成使用者自定義的一些任務,可以將使用者級任務排程放到系統級任務排程來完成(不建議這麼做),但是反過來卻不行,root使用者的任務排程操作可以通過”crontab –uroot –e”來設定,也可以將排程任務直接寫入/etc/crontab檔案,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab檔案,即使在root使用者下建立一個定時重啟系統的任務也是無效的。

(3)新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。

(4)當crontab失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

(5)千萬別亂執行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除使用者的Crontab檔案。刪除了,該使用者的所有crontab都沒了。

(6)在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義%,如經常用的date ‘+%Y%m%d’在crontab裡是不會執行的,應該換成date ‘+\%Y\%m\%d’。

(7)更新系統時間時區後需要重啟cron,在ubuntu中服務名為cron:
(8)注意環境變數問題(我在做iptables測試時發現這個問題)
有時我們建立了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由於在crontab檔案中沒有配置環境變數引起的。

在crontab檔案中定義多個排程任務時,需要特別注環境變數的設定,因為我們手動執行某個任務時,是在當前shell環境下進行的,程式當然能找到環境變數,而系統自動執行任務排程時,是不會載入任何環境變數的,因此,就需要在crontab檔案中指定任務執行所需的所有環境變數,這樣,系統執行任務排程時就沒有問題了。

不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll指令碼中提供所有必要的路徑和環境變數,除了一些自動設定的全域性變數。所以注意如下3點:

指令碼中涉及檔案路徑時寫全域性路徑;
指令碼執行要用到java或其他環境變數時,通過source命令引入環境變數,如:

cat start_cbp.sh
!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
當手動執行指令碼OK,但是crontab死活不執行時,很可能是環境變數惹的禍,可嘗試在crontab中直接引入環境變數解決問題。如:

0 * * * * . /etc/profile;/bin/sh  /var/test/restart_audit.sh

2017-01-16增加的內容
為了防止命令重複執行可以使用flock 進行
23 2 * * * (flock -xn /tmp/test.lock -c “/bin/bash /etc/openvas/openvas.sh >>/var/log/openvas-sync.log 2>&1”)