Linux之crontab定時任務設定
原文地址:https://www.cnblogs.com/tankblog/p/6934987.html
Linux定時任務有:cron、anacron、at等,這裡主要介紹cron服務。
名詞解釋:
cron是服務名稱,crond是後臺程序,crontab則是定製好的計劃任務表。
軟體包安裝:
要使用cron服務,先要安裝vixie-cron軟體包和crontabs軟體包,兩個軟體包作用如下:
vixie-cron軟體包是cron的主程式。
crontabs軟體包是用來安裝、卸裝、或列舉用來驅動 cron 守護程序的表格的程式。
檢視是否安裝了cron軟體包: rpm -qa|grep vixie-cron
檢視是否安裝了crontabs軟體包:rpm -qa|grep crontabs
如果沒有安裝,則執行如下命令安裝軟體包(軟體包必須存在)
rpm -ivh vixie-cron-4.1-54.FC5*
rpm -ivh crontabs*
如果本地沒有安裝包,在能夠連網的情況下可以線上安裝
yum install vixie-cron
yum install crontabs
檢視crond服務是否執行:
pgrep crond
或
/sbin/service crond status
或
ps -elf|grep crond|grep -v "grep"
crond服務操作命令:
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
配置定時任務:
cron有兩個配置檔案,一個是一個全域性配置檔案(/etc/crontab),是針對系統任務的;一組是crontab命令生成的配置檔案(/var/spool/cron下的檔案),是針對某個使用者的.定時任務配置到任意一箇中都可以。
檢視全域性配置檔案配置情況: cat /etc/crontab
---------------------------------------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 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
----------------------------------------------
檢視使用者下的定時任務: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> 意味著在範圍內可以跳過 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 檔案改變後就不必重新啟動守護程序了。
重啟crond:
/sbin/service crond restart
檢視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)
檢視shell指令碼是否報錯:
如果/var/log/cron中準時呼叫了shell指令碼,而又沒有達到預期結果,我們就要懷疑shell指令碼是否出錯
cat /var/spool/mail/使用者名稱
例子:
cat /var/spool/mail/root
test.sh
-------------------------
#!/bin/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
-------------------------
#!/bin/sh
set -xv
echo "$(date '+%Y-%m-%d %H:%M:%S') hello world!" >> /root/test.log
-------------------------
sh ./test.sh 2>tt.log
網上查詢到的資料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指令碼,輸入內容後儲存。
參考資料:http://blog.csdn.NET/zhangskd/article/details/6854589
http://my.oschina.Net/u/576757/blog/71084
http://linux.vbird.org/linux_basic/0430cron.PHP 關於anacron鳥哥的文章中有說明
http://study.chyangwa.com/IT/AIX/aixcmds1/crontab.htm