一.crond指令
crond 是linux用來定期執行程式的指令。當安裝完成作業系統之後,預設便會啟動此任務排程指令。crond指令每分锺會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重新開機服務
/sbin/service crond reload //重新載入配置
/sbin/service crond status //檢視服務狀态
crond讀取一個或多個配置檔案,這些配置檔案中包含了指令行及其調用時間。
crond的配置檔案稱為“crontab”,是“cron table”的簡寫。
二.crond在3個地方查找配置檔案
1、/var/spool/cron/ 這個目錄下存放的是每個使用者包括root的crontab任務,每個任務以建立者的名字命名,比如tom建的crontab任務對應的檔案就是/var/spool/cron/tom。
一般一個使用者最多隻有一個crontab檔案。
2、/etc/crontab 這個檔案負責安排由系統管理者制定的維護系統以及其他任務的crontab。
3、/etc/cron.d/ 這個目錄用來存放任何要執行的crontab檔案或腳本。
三.權限
crontab權限問題到/var/adm/cron/下一看,檔案cron.allow和cron.deny是否存在
用法如下:
1、如果兩個檔案都不存在,則隻有root使用者才能使用crontab指令。
2、如果cron.allow存在但cron.deny不存在,則隻有列在cron.allow檔案裡的使用者才能使用crontab指令,如果root使用者也不在裡面,則root使用者也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,則隻有列在cron.deny檔案裡面的使用者不能使用crontab指令,其它使用者都能使用。
4、如果兩個檔案都存在,則列在cron.allow檔案中而且沒有列在cron.deny中的使用者可以使用crontab,如果兩個檔案中都有同一個使用者,
以cron.allow檔案裡面是否有該使用者為準,如果cron.allow中有該使用者,則可以使用crontab指令。
四. crontab指令
crond服務提供crontab指令來設定crond服務的,以下是這個指令的一些參數與說明:
crontab -u //設定某個使用者的crond服務,一般root使用者在執行這個指令的時候需要此參數
crontab -l //列出某個使用者crond服務的詳細内容
crontab -r //删除某個使用者的crond服務
crontab -e //編輯某個使用者的crond服務
比如說root檢視自己的crond設定:crontab -u root -l
再例如,root想删除fred的crond設定:crontab -u fred -r
五.配置crontab
可用crontab -e指令來編輯,編輯的是/var/spool/cron下對應使用者的cron檔案,也可以直接修改/etc/crontab檔案
具體格式如下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 指令
每個字段代表的含義如下:
Minute 每個小時的第幾分鐘執行該任務,0-59
Hour 每天的第幾個小時執行該任務,0-23
Day 每月的第幾天執行該任務,1-31
Month 每年的第幾個月執行該任務,1-12
DayOfWeek 每周的第幾天執行該任務,0-6,0表示星期日,也可以用英文來表示,sun表示星期天,mon表示星期一
Command 指定要執行的程式
記住幾個特殊符号的含義:
“*”代表取值範圍内的數字,
“/”代表”每”,
“-”代表從某個數字到某個數字,
“,”分開幾個離散的數字
舉例如下:
5 * * * * ls 指定每小時的第5分鐘執行一次ls指令
30 5 * * * ls 指定每天的 5:30 執行ls指令
30 7 8 * * ls 指定每月8号的7:30分執行ls指令
30 5 8 6 * ls 指定每年的6月8日5:30執行ls指令
30 6 * * 0 ls 指定每星期日的6:30執行ls指令
30 3 10,20 * * ls 每月10号及20号的3:30執行ls指令
25 8-11 * * * ls 每天8-11點的第25分鐘執行ls指令
*/15 * * * * ls 每15分鐘執行一次ls指令
30 6 */10 * * ls 每個月中,每隔10天6:30執行一次ls指令
50 7 * * * root run-parts /etc/cron.daily
每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行檔案[ 注:run-parts參數表示,執行後面目錄中的所有可執行檔案。 ]
六.crontab中的輸出配置
以上的定時任務執行結果都被輸出到對應使用者的email中,crond支援将執行結果輸出到指定檔案中
crontab中經常配置運作腳本輸出為:>/dev/null 2>&1,來避免crontab運作中有内容輸出。
shell指令的結果可以通過‘> ’的形式來定義輸出
/dev/null 代表空裝置檔案
> 代表重定向到哪裡,例如:echo "123" > /home/123.txt
1 表示stdout标準輸出,系統預設值是1,是以">/dev/null"等同于"1>/dev/null"
2 表示stderr标準錯誤
& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
那麼重定向輸出語句的含義:
1>/dev/null 首先表示标準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,不顯示任何資訊。
2>&1 表示标準錯誤輸出重定向等同于标準輸出,因為之前标準輸出已經重定向到了空裝置檔案,是以标準錯誤輸出也重定向到空裝置檔案。
例1:每天5:30執行ls指令,并把結果輸出到/jp/test.log檔案中
30 5 * * * ls >/jp/test.log 2>&1
七.crontab與環境變量
不要假定crond知道所需要的特殊環境,它其實并不知道。是以你要保證在要執行的shelll腳本中提供所有必要的路徑和環境變量,除了一些自動設定的全局變量。是以注意如下3點:
1、腳本中涉及檔案路徑時寫全局路徑;
2、腳本執行要用到java或其他環境變量時,通過source指令引入環境變量,如:
cat start_cbp.sh
#!/bin/sh
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 &
3、當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,并可以嘗試在crontab中直接引入環境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
八.其他應該注意的問題
1、新建立的crond job,不會馬上執行,至少要過2分鐘才執行。如果重新開機crond則馬上執行。
2、
每條 JOB 執行完畢之後,系統會自動将輸出發送郵件給目前系統使用者。日積月累,非常的多,甚至會撐爆整個系統。是以每條 JOB
指令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job
中的指令需要正常輸出已經作了一定的處理,
比如追加到某個特定日志檔案。
3、當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日志看某個job有沒有執行報錯 tail -f /var/log/cron。
4、千萬别亂運作crontab -r。它從Crontab目錄(/var/spool/cron)中删除使用者的Crontab檔案。删除了該使用者的所有crontab都沒了。
5、在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’在crontab裡是不會執行的,應該換成date ‘+\%Y\%m\%d’。
附錄:
http://blog.csdn.net/hi_kevin/article/details/8983746