1. 定時任務比較及cron語法
Linux的任務調度可以分為兩類:
|
?
Linux系統下另外兩種定時任務軟件:
at:適合僅執行一次的調度任務,需要啟動一個名為atd的服務 ? anacron:這個命令主要用于非7*24小時開機的服務器,anacron并不能指定具體時間執行任務,而是以天為周期或者在系統每次開機后需要執行的任務,它會檢測停機期間應該進行,但是并沒有進行的crontab任務工作,執行一遍。 ? 這兩種比較少用 |
?
指令語法:
Crontab? [-u user] file Crontab? [-u user] {-l |-r |-e} |
?
指令說明:
通過crontab我們可以在固定的間隔時間執行指定的系統指令或shell腳本,時間間隔可以是分鐘、小時、日、月、周及以上的任意組合(日和周不要組合)。 |
?
2. 使用者權限文件
文件 | 說明 |
/etc/cron.deny | 該文件所列用戶不允許使用crontab命令 |
/etc/cron.allow | 該文件所列用戶允許使用crontab命令 |
/var/spool/cron | 所有用戶crontab文件存放的目錄,以用戶名命名 |
?
3. 指令選項說明含義表
參數名稱 | 含義 | 指定示例 |
-l(字母) | 顯示用戶crontab文件內容, | crontab? -l |
-e | 進入vi編輯用戶crontab文件 | crontab? -e |
-i | 刪除用戶crontab文件前確認提示 | crontab? -i |
-r | 從crontab目錄中刪除用戶crontab文件 | crontab? -r |
-u user | 指定使用者 | crontab? –u qinbf –l |
?
4. 指令的使用格式
????? 默認情況下,用戶所見建立的crontab文件存放于/var/spool/cron文件中,其crontab對應的文件名與用戶名一致。
????? 格式共分為七段,前五段為時間設定段,第六段以哪個用戶執行crontab(默認是當前用戶),第七段為所要執行的命令段。
?
5. Crontab時間段的含義如表:
段 | 含義 | 取值范圍 |
第一段 | 分鐘 | 00-59 |
第二段 | 小時 | 00-23 |
第三段 | 日期 | 01-31 |
第四段 | 月份 | 01-12 |
第五段 | 星期幾 | 0-6 |
?
6. 特殊符號含義如下:
特殊符號 | 含義 |
* | 表示任意時間都 |
- | 減號,表示分隔符,表示一個時間范圍段 |
, | 逗號,表示分隔時間段的意思 |
/n | n代表數字,“即每隔n單位時間” |
?
7. crontab依賴的服務:
chkconfig?? --list |grep? crond ? /etc/init.d/crond? status |
?
8. crontab實例說明
1) 30? 3,12? *? *? * /bin/sh /scripts/oldboy.sh 2) 30? */6? *? *? * /bin/sh /scripts/oldboy.sh? #--à第二列*/6表示每6個小時,也相當于6,12,18,24 3)30? 8-18/2? *? *? * /bin/sh /scripts/oldboy.sh #-à第二列8-18/2代表早晨8點到下午18點之間每2小時,也相當于8,10,12,14,16,18 4)*? 23-7/1? *? *? *? /application/apachectl restart?? #----à實際上的效果是,晚上到早上的7點,每小時的每一分鐘都重啟apache,如果是想達到每小時才重啟的話,前面的分鐘段,可以設置為0或者30之類的 5)服務器時間同步:系統每5分鐘同步一次時間 [root@test2 ~]# crontab -l */5 * * * * /sbin/ntpdate time.windows.com? >/dev/dull 2&>1 |
?
9. crontab命令生產環境專業寫法
例1:每一分鐘打印一次自己的名字到/server/log/自己的名字命令的文件中。 答案: #print char task by oldboy for programmer A at 2010-12-12 */1? *? *? *? *? echo? “oldboy” >>/server/log/oldboy.log 2>&1 ? 例2:每周六、日上午9:00和下午14:00來老男孩linux運維實戰培訓中心學習(/server/script/oldboy.sh) 答案: #cron? job for ett by oldboy 2010-12-12 00?????? 09,14? *? *? 6,0? /bin/sh /server/script/oldboy.sh >/dev/null 2>&1 針對以上兩生產例子說明: 1寫定時任務要寫清注釋是個好習慣,比如什么人,什么時間,因為誰,做了什么事 2執行任務時可以省略用戶,在執行腳本時,盡量帶上/bin/sh,否則有可能因為腳本沒有執行權限而無法執行 3需要root權限執行的任務可以登錄到root用戶下然后設置,如果不需要root權限,可以登錄到普通用戶下,然后設置,這里要注意不同用戶的環境變量問題。 4定時任務命令的結尾最好加上>/dev/null 2>&1等內容,如果需要打印日志,可以追加到指定日志,不推薦留這種不專業的做法 如果定時任務不加>/dev/null 2>&1等命令設置,時間長了,可能會導致郵件臨時目錄/var/spool/clientmqueue文件數猛增,占用大量磁盤空間inode節點。 5在開發定時任務程序或腳本時,在調試好腳本程序后,應盡量把DEBUG及屏幕輸出的內容命令去掉,如果還需要,可定向到日志里。 |
?
10. crontab生產解決案例
案例1:No? space? left? on? device故障1
在設置crontab時,提示No ?space? left? on device。用df –k檢查還有空間,用df –i顯示/var已占用100%,如果inode耗盡,則系統上下將不能創建文件。
在/var/spool/clientmqueue/下有超多的文件ls半天沒反應,用rm? -fr? *會自動跳出root,然后用xargs來配合解決。cd? /var/spool/clientmqueue&& ls |xargs rm –f
最后清理了該目錄的內容。當然,如果文件數超多,執行ls |xargs rm –f也會長時間無反應,此時也可以直接cd /var/spool/&&rm –rf clientmqueue,然后mkdir clientmqueque && chmod 770 clientmqueue &&chown smmsp,smmsp? -R /var/spool/clientmqueue。
原因分析:系統中,cron執行的程序有輸出內容,輸出內容會以郵件形式發給cron的用戶,而sendmail沒有啟動所以就會產生這些文件。
解決辦法:開啟郵件服務,并將crontab里面的命令后面加上>/dev/null 2>&1,在做定時腳本時,把屏幕輸出定向到日志中。
?
案例2:No space left on device故障2
(1) when you create a new directory of file,system will say :No space left on device
[ett@linux /var]#mkdir ett Mkdir:cannot create directory ett’:No space left on device |
?
(2) when create crontab for account ett,you will receive error information as follows;
Crotab:installing new crontab Cron/tmp.6655:No space left on device Crontab:edits left in /tmp/crontab.6655 |
解決過程 1檢查分區使用率,df? -h 2檢查/var/lock下的文件,刪除/var/lock/subsys/nfx,touch /var/ett,成功創建文件,刪除/var/ett 3發現刪除/var/lock下的任意一個文件后,都可以成功創建一個文件,再創建就會失敗。 4將檢查擴大到/var/下的其他目錄 5懷疑分區/var/de inode用盡導致上述問題,檢查inode使用率 6分區/var/沒有配置quota 7發現/var/spool/clientmqueue下面有太多的文件,由于系統的郵件服務配置有問題,導致系統發出的郵件堆積在隊列目錄中,占用大量的inode節點。 ? 處理方法:確認/var/spool/clientmqueue下的文件已經無用,刪除之,如果文件數量太大,無法使用rm -f * 直接刪除,可以選擇ls |xargs rm -f 或者直接刪除上級目錄,然后重建該目錄,并賦予正確的屬主和權限。 ? 最好的解決辦法是重新設置系統郵件,使其能正常發送或找到發郵件的源頭,如本文的crontab任務。 ? 結論:分區/var/的 inode全部用盡,free inode為0,導致無法創建新的文件或目錄,以后遇到類似的問題要注意用df? -li檢查inode的使用情況。 |
?
11. 生產場景如何調試crontab定時任務
?
|
?
12. 定時任務生產問題8條箴言
?
|
??
?13. 定時清理垃圾文件
??
crontab? -l |tail -2 #del clientmqueue? files? by oldboy at 2010-09-26 00 00? *? *? 0 /bin/bash? /server/scripts/del_sys_file.sh > /dev/null? 2>&1 ? cat /server/scripts/del_sys_file.sh find /var/spool/clientmqueue/? -type? f | xargs? rm? -f |
?
14. crond章節重點
1) 用戶使用crontab? -e自定義定時任務項目,分為六段,[分、時、日、月、周、指令]。
2) 系統的/etc/crontab定時任務項目分為7段,[分、時、日、月、周、用戶、指令]。
3) crontab定時任務的5個生產基本要領和7點調試技巧,尤其是學會看服務日志來調試
4) 生產環境使用crontab定時任務要注意的8點箴言
5) 重視生產的案例及通過案例為載體來學習鞏固技術知識