Crond定時任務 任務調度
Crond是linux系統中用來定期執行命令或程序任務的服務.一般情況下,安裝完操作系統之後,默認便會啓動此任務調度服務.crond服務會定期檢查系統中是否有要執行的任務工作,如果有,便會根據預先默認的規則自動執行該任務工作.
Linux任務調度的工作可以分爲以下兩類:
◆系統自身執行的工作:系統週期性執行的任務工作,如輪詢系統日誌,備份系統數據,清理緩存等.
◆用戶執行的工作:某個用戶定期要做的任務工作,例如每隔10分鐘和互聯網上服務器進行時間同步,每天晚上0點備份站點數據,一般此類這些工作需要由每隔用戶自行設置.
1.1指令語法
Crontab [-u user]file
Crontab [-u user]{-l|-r|-e}
1.2指令說明
通過crontab我們可以在固定的間隔時間執行指定的系統指令或shell script腳本.時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合.這個命令非常適合週期性的日誌分析或數據備份等工作.
1.3使用者權限文件
文件 |
說明 |
/etc/cron.deny |
該文件中所列用戶不允許使用crontab命令 |
/etc/cron.allow |
該文件中所列用戶允許使用crontab命令 |
/var/spool/cron/ |
所有用戶crontab文件存放的目錄,以用戶名命名※ |
1.4指令選項說明含義表
參數名稱 |
含義 |
指定示例 |
-l(字母) |
顯示用戶crontab文件內容.提示:l爲list縮寫 |
Crontab –l※ |
-e |
進入vi編輯用戶crontab文件,e爲edit縮寫 |
Crontab –e※ |
-i |
刪除用戶crontab文件前確認提示 |
Crontab –ri |
-r |
從crontab目錄中刪除用戶crontab文件 |
Crontab –r |
-u user |
指定使用者 |
Crontab –u oldboy |
1.5指令的使用格式
默認情況下,用戶所建立的crontab文件存於/var/spool/cron/目錄中,其crontab對應的文件名與用戶名一致.
格式共分爲7段,前5段爲時間設定段,第6段爲以哪個用戶執行crontab(默認是當前用戶),第7段爲所要執行的命令段.
格式如下:
01**** root run-parts /etc/cron hourly
024***root run-parts /etc/cront daily
224**0root run-parts /etc/cron weekly
4241**root run-parts /etc/cron monthly
1.5.1crontab時間段的含義如表:
段 |
含義 |
取值範圍 |
第一段 |
代表分鐘 |
00-59 |
第二段 |
代表小時 |
00-23 |
第三段 |
代表日期 |
01-31 |
第四段 |
代表月份 |
01-12 |
第五段 |
代表星期幾,0代表星期日 |
0-6(這裏爲了記憶忽略7) |
1.5.2特殊符號含義如下表:
特殊符號 |
含義 |
* |
表示任意時間都,如0023***command表示無論何月何日何周的23:00執行任務. |
- |
減號,表示分隔符,表示一個時間範圍段,如17-19點,每小時的00分執行任務.00 17-19 ***commond |
, |
逗號,表示分割時段的意思.30 17,18,19***/bin/sh /scripts/wj.sh每天的17點,18點和19點的半點時刻執行/scripts/wj.sh |
*/n |
n代表數字,即”每隔n單位時間”,例如:每10分鐘執行一次任務:*/10 ****command,其中*/10也可以寫成0-59/10 |
1.6crontab依賴的服務
[root@hcf ~]# chkconfig --list|grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@hcf ~]# /etc/init.d/crond status
crond (pid 36919) is running...
[root@hcf ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
1.7實例說明
[root@dockers ~]# crontab -l
* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null
* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type d|xargs chmod 775 2>/dev/null
* */1 * * * /bin/chown ylm. /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -R 2>/dev/null
* * * * 6 /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/logs/ -ctime +5 -type f|xargs -i rm -f {} >/dev/null 2>&1
在上例中除了數字與英文名稱,還使用到了符號”*”,這個*號代表每一單位的意思.
第1列爲分鐘,特殊符號”/”表示每隔的意思,即每隔一分鐘執行/bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null程序.
- 30 3,12***/bin/sh /scripts/wj.sh在本例中,其中的第1列爲30,表示30分鐘,第2列爲3,12代表3點及12點,此定時任務的意思是每天凌晨3點和中午12點的半點時刻(或者每天凌晨3:30和中午12:30)執行/scripts/wj.sh
- 30 */6*** /bin/sh /scripts/wj.sh在本例中,其中的第1列爲30,表示30分鐘,第2列*/6代表每6個小時,也相當於6,12,18,24的作用,每隔6個小時的半點時刻執行後面的腳本任務
- 30 8-18/2 *** /bin/sh /scripts/wj.sh在本例中,其中的第1列爲30,表示30分鐘,第二列8-18/2代表在早晨8點到下午18點之間每隔2小時,也相當於8,10,12,14,16,18的作用,早晨8點到下午18點之間每隔2小時的30分時刻執行後面腳本
- 30 21***/application/apache/bin/apachectl graceful每晚的21:30重啓apache
- 45 4 1,10,22**/application/apache/bin/apachectl graceful每月1,10,22日的凌晨4:45分重啓apache
- 10 1** 6,0/application/apache/bin/apachectl graceful每週六週日的凌晨1:10分重啓apache
- 0,30 18-23***/application/apache/bin/apachectl graceful每天18點到23點的0分和30分時重啓apache,提示:最後一次執行任務是23:30分
- 00 */1 ***/application/apache/bin/apachectl graceful每隔1小時整點重啓apache
- * 23-7/1 ***/application/apache/bin/apachectl graceful晚上23點到早上7點之間,每隔1小時重啓apache 提示:以上結果是不對的,爲什麼?以上定時任務的第一列爲*,表示每分都執行任務即表示晚上23點到早上7點之間,每小時的每分鐘都重啓apache,很可怕.
- 0 11 * 4 1-3/application/apache/bin/apachectl graceful4月的每週一到週三的11點重啓apache
1.8crontab命令生產環境專業寫法
把所有的任務,寫入到一個可執行文件(shell編程),由crond調用執行文件.
例1:每分鐘打印一次自己的名字到/server/log/自己的名字命名的文件中.
答案:
#print char task by wj for programmer A at 2010-12-12
*/1 **** echo “wj” >>/server/log/wj.log 2>&1
例2:每週六、日上午9:00和下午14:00去學習linux運維
答案:
#cron job for ett by wj 2010-12-12
00 9,14 **6,0 /bin/sh /server/script/wj.sh>dev/null 2>&1
針對以上兩生產例子說明:
- 寫定時任務要寫清註釋是個好習慣,如:什麼人,什麼時間,因爲誰,做了什麼事.都標記
清楚了,這樣其他維護人員可以很容易理解.如wj於2016-12-12日在A服務器上做了每10分鐘同步時間的操作(如果是開發的任務可以寫上需求人).
- 執行任務時可以省略用戶,在執行腳本時,儘量帶上/bin/sh,否則有可能腳本沒執行
權限而無法執行.
- 需要root權限執行的任務可以登錄到root用戶下然後設置,如果不需要root權限,
可以登錄到普通用戶下,然後設置.這裏要特別注意不同用戶的環境變量問題,如果是調用了環境變量(如生產場景java腳本),此時,最好在腳本中將環境變量重新export下.
- 定時任務命令的結尾最好加上>/dev/null 2>&1等內容,如果需要打出日誌,可以追加到
指定的日誌裏,不推薦留空這種不專業的做法.
其中,/dev/null爲特殊的設備,表示黑洞設備或空設備.2>&1使標準錯誤和標準輸出一樣,本命令內容即把腳本的輸出重定向到/dev/null,即不記錄任何輸出,也不給系統發郵件.
如果定時任務不加>/dev/null 2>&1等命令配置,時間長了,可能會導致郵件臨時目錄/var/spool/clientmqueue文件數猛增,佔用大量磁盤空間.
提示:上面寫法也可以寫成1>/dev/null 2>/dev/null,例子 $JAVA-jar
$RESIN_HOME/lib/resin.jar$ARGS stop 1>/dev/null 2>/dev/null來自resin默認啓動腳本
- 在開發定時任務程序或腳本時,在調試好腳本程序後,應儘量把DEBUG及屏幕輸出的內
容的命令去掉,如果還需要,可定向到日誌裏.
1.9crontab生產解決案例
案例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 –rf *會自動跳出root,然後用xargs來配合解決.cd /var/spool/clientmqueue&&ls|xargs rm –f
最後清理了該目錄中的內容.當然,如果文件數超多,執行ls|xargs rm –f也會長時間無反應,此時,也可以直接cd /var/spool&&rm -rf clientmqueue,然後mkdir clientmqueue&&chmod 770 clientmqueue && chown smmsp.smmsp –R /var/spool/clientmqueue。系統中/var/spool/clientmqueue目錄默認權限爲:
原因分析:系統中cron執行的程序有輸出內容,輸出內容會以郵件形式發給cron的用戶,而sendmail沒有啓動所以就產生了這些文件;
解決辦法:開啓郵件服務,並將crontab裏面的命令後面加上>/dev/null 2>&1,在做定時腳本時,把屏幕輸出定向到日誌中.
案例2:No space left on device 故障2
1.wnen you create a new directory or file ,system will say :no space left on device
mkdir ett
mkdir:cannot create directory ett:No space left on device
2.when create crontab for account ett,you will receiveerror information as follows:
“Crontab.6655” 1L
Crontab:installing new crontab
Cron /tmp.6655:No space left on device
Crontab:edits left in /tmp/crontab.6655
解決過程:
- 檢查分區使用率:df –lk使用最多分區/var的使用率只有79%,硬盤空間還夠用.
- 檢查/var/lock下的文件,刪除/var/locks/subsys/nfs後,touch /var/ett,成功創建文件,刪除/var/ett
- 發現刪除/var/lock下的任意一個文件後,都可以成功創建一個文件,再創建就會失敗.
Touch /var/ett 成功 touch /var/ett1失敗
Touch:creating ett1:No space left on device.
- 將檢查擴大到/var下的其他目錄
cd /var/www/icons mv a.gif /tmp mv a.png /tmp --------移走兩個文件
df –li touch ett touch bb touch cc
touch:creating cc:No space left on device ------------只能創建兩個文件,當創建第三個文件時,出錯
- 懷疑分區/var的inode用盡導致上述問題,檢查inode使用率
df –li
發現/var的inode使用率已經達到100%,空餘的inode爲0
- 分區/var沒有配置quota,平均每個inode的佔用空間爲:497829k(var分區大小)/128520(inodes)=3.87k,說明分區的最小block爲4k,無法增加inode限額.
- 發現/var/spool/clientmqueue下面有太多的文件,共有127679個,佔用了127679/128520(inodes)=99.3%的inode節點數,由於系統 的郵件服務配置有問題,導致系統發出的郵件堆積在隊列目錄中,佔用的大量的inode節點.
處理方法:確認/var/spool/clientmqueue下的文件已經無用後,刪除之.然後/var寫
入正常.
最好的解決辦法是重新設置系統郵件,使其能正常發送或找到發郵件的源頭,如
本文的crontab任務.
刪除文件後的inode使用情況. df –li
案例3:No space left on device 故障還原
本案裏借鑑了http://blog.sina.com.cn/s/blog_4dd475390100c47m.html文章,並進行了實踐還原故障.