linux crond定時任務 任務調度

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文章,並進行了實踐還原故障.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章