天天看點

linux定時任務crontab配置

本文參考

http://blog.csdn.net/jbgtwang/article/details/7995801

實作linux的定時任務有好幾種,這裡詳細介紹下cron服務

名詞解釋:

cron是服務名稱,crond是背景程序,crontab則是定制好的計劃任務表。

檢視crond服務是否運作

pgrep crond。

重新開機服務指令

當你定制了任務時,你需要重新開機cron服務。

可以分為兩種情況:

1.在系統中有service這個指令時:

這個指令在red hat當中常用,有的linux發行版本中沒有這個指令.

$ service crond start //啟動服務

$ service crond stop //關閉服務

$ service crond restart //重新開機服務

2.linux發行版本沒有service這個指令時:

/etc/init.d/cron stop

/etc/init.d/cron start

配置定時任務:

cron有兩個配置檔案,一個是一個全局配置檔案(/etc/crontab),是針對系統任務的;一組是crontab指令生成的配置檔案(/var/spool/cron下的檔案),是針對某個使用者的.定時任務配置到任意一個中都可以。

檢視全局配置檔案配置情況: cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

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.mnthly

檢視使用者下的定時任務:crontab -l或cat /var/spool/cron/使用者名

crontab任務配置基本格式:

* *  *  *  *  command

分鐘(0-59) 小時(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  指令

第1清單示分鐘1~59 每分鐘用或者 /1表示

第2清單示小時1~23(0表示0點)

第3清單示日期1~31

第4清單示月份1~12

第5列辨別号星期0~6(0表示星期天)

第6列要運作的指令

在以上任何值中,星号(*)可以用來代表所有有效的值。譬如,月份值中的星号意味着在滿足其它制約條件後每月都執行該指令。

整數間的短線(-)指定一個整數範圍。譬如,1-4 意味着整數 1、2、3、4。

用逗号(,)隔開的一系列值指定一個清單。譬如,3, 4, 6, 8 标明這四個指定的整數。

正斜線(/)可以用來指定間隔頻率。在範圍後加上 / 意味着在範圍内可以跳過 integer。

譬如,0-59/2 可以用來在分鐘字段定義每兩分鐘。間隔頻率值還可以和星号一起使用。

例如,*/3 的值可以用在月份字段中表示每三個月運作一次任務。

開頭為井号(#)的行是注釋,不會被處理。

例子:

0 1 * * * /home/testuser/test.sh

每天晚上1點調用/home/testuser/test.sh

/10 * * * /home/testuser/test.sh

每10鐘調用一次/home/testuser/test.sh

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重新開機apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重新開機apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每周六、周日的1 : 10重新開機apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重新開機apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每星期六的11 : 00 pm重新開機apache。

    • / 1 * * * /usr/local/etc/rc.d/lighttpd restart

      每一小時重新開機apache

    • 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

      晚上11點到早上7點之間,每隔一小時重新開機apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号與每周一到周三的11點重新開機apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一号的4點重新開機apache

/30 * * * /usr/sbin/ntpdate 210.72.145.44

每半小時同步一下時間

配置使用者定時任務的文法:

crontab [-u user]file

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

參數與說明:

crontab -u//設定某個使用者的cron服務

crontab -l//列出某個使用者cron服務的詳細内容

crontab -r//删除沒個使用者的cron服務

crontab -e//編輯某個使用者的cron服務

例子:

假設目前使用者是root,要建立root使用者的定時任務

crontab -e

選擇編輯器,編輯定時任務(這裡假設是編輯器是vi)

按i進入編輯模式

0 1 * * * /root/test.sh

按esc退出編輯模式進入普通模式,輸入:x或:wq儲存退出

檢視剛剛輸入的定時任務

crontab -l 或 cat /var/spool/cron/root

根使用者以外的使用者可以使用 crontab 工具來配置 cron 任務。所有使用者定義的 crontab 都被儲存在 /var/spool/cron 目錄中,并使用建立它們的使用者身份來執行。要以某使用者身份建立一個 crontab 項目,登入為該使用者,然後鍵入 crontab -e 指令,使用由 VISUAL 或 EDITOR 環境變量指定的編輯器來編輯該使用者的 crontab。該檔案使用的格式和 /etc/crontab 相同。當對 crontab 所做的改變被儲存後,該 crontab 檔案就會根據該使用者名被儲存,并寫入檔案 /var/spool/cron/username 中。

cron 守護程序每分鐘都檢查 /etc/crontab 檔案、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。如果發現了改變,它們就會被載入記憶體。這樣,當某個 crontab 檔案改變後就不必重新啟動守護程序了。

檢視cron服務是否起作用:

如果我們要檢視定時任務是否準時調用了可以/var/log/cron中的運作資訊

cat /var/log/cron

grep .*.sh /var/log/cron

搜尋.sh類型檔案資訊

sed -n ‘/back.*.sh/p’ /var/log/cron

格式sed -n ‘/字元或正規表達式/p’ 檔案名

我們在日志中檢視在約定的時間是否有相應的調用資訊,調用資訊類似:

Sep 19 1:00:01 localhost crond[25437]: (root) CMD (/root/test.sh)

網上查詢到的資料crontab不執行的問題:

第一,腳本的原因:大多數情況下,我們要相信科學,相信計算機,不是有鬼,就是我們的腳本的問題,這種問題導緻crontab不能執行的機率占到 70%以上。因為程式執行到某一步導緻crontab終止執行,我就碰到一次在遷移代碼的時候将資料庫連錯了。導緻無法通路而死在那裡了。

第二,執行環境問題,當我們碰到第一情況下,一般都可以通過手動執行程式将問題扼殺在搖籃裡,一般情況下高手是不應該犯第一種錯誤的。問題是當我們 手動執行成功而crontab不能執行的時候,筆者碰到一次就是執行環境的問題,例如相關路徑的設定問題。解決方案:在代碼最前面執行 source /home/user/.bash_profile

第三,系統時間不正确。這種問題最好了解,也是比較常見和隐蔽的問題,解決方案:date -s **

第四,就是我們的腳本是否有可執行權限。必須保證執行腳本的使用者有執行改檔案的權限。

第五,crontab 守護程序死掉了。這種情況是極少發生的,但也不排除,當我們實在是找不到其他原因的時候可以用。解決方案:重新開機該程序。

第六,crontab不執行的問題困擾了好長時間,腳本寫的都正确,但是就是不執行,最終解決方法如下:

crontab -u root /var/spool/cron/root

這樣root使用者的crontab就生效了

service crond restart

重新開機下服務就好了

第七,crond沒有啟動

第八,腳本編碼問題,腳本在window下編寫,傳到linux下後報“锘?!/bin/bash”,用vi編輯器建立新shell腳本,輸入内容後儲存。

檢視shell腳本是否報錯:

如果/var/log/cron中準時調用了shell腳本,而又沒有達到預期結果,我們就要懷疑shell腳本是否出錯

cat /var/spool/mail/使用者名

例子:

cat /var/spool/mail/root

test.sh

echo “$(date ‘+%Y-%m-%d %H:%M:%S’) hello world!” >> /root/test.log

要追蹤shell調用的全過程:

bash -xv test.sh 2>test.log

test.sh的調用過程都會寫到test.log中

改寫test.sh

set -xv

echo “$(date ‘+%Y-%m-%d %H:%M:%S’) hello world!” >> /root/test.log

sh ./test.sh 2>tt.log

繼續閱讀