天天看點

linux 定時任務 crond 服務應用指南(項目執行個體) Linux的定時任務crond(crontab)服務 Linux的定時任務分類 定時任務crond使用說明 定時任務crond執行個體說明 生産環境crond專業執行個體 crond定時任務生産應用問題10箴言 crond生産環境案例及解決過程

linux定時任務crond服務應用指南

1、crond是什麼?

crond是linux系統中用來定期執行指令或者指定程式的程式(軟體)

2、秒級任務

         (1)crond需要方式實作

         (2)自己寫守護程序shell循環

         (3)Quartz也可實作妙計任務

3、定時任務的作用

         伺服器:7*24小時開機提供服務是網站的基本特征

         有重要資料:提高備份周期和備份數量

linux系統中定時任務排程的工作可以分為一下兩種

(1)系統自身的定期執行的任務

         系統周期性自行執行的任務工作。如輪詢系統日志、備份系統資料、清理系統緩存等

[root@ysolin ~]# ls -l /var/log/messages*    系統的日志

-rw-------. 1 root root 201123 6月  28 14:44 /var/log/messages

-rw-------. 1 root root 200796 6月  26 03:49 /var/log/messages-20160626

系統自動輪詢任務的設定配置路徑:

[root@ysolin ~]# ls -l /etc/ |grep cron

-rw-------.  1 root root    541 11月 23 2013 anacrontab

drwxr-xr-x.  2 root root   4096 6月  24 18:13 cron.d

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.daily

-rw-------.  1 root root      0 11月 23 2013 cron.deny

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.hourly

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.monthly

-rw-r--r--.  1 root root    457 9月  27 2011 crontab

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.weekly

(2)使用者執行的定時任務

         某個使用者或系統管理者定期要做的任務工作,使用者執行放入任務工作,也就是我們運維管理人員執行的任務工作。

         例如:伺服器時間同步

[root@ysolin ~]# crontab -l #檢視定時任務

time sync by solin

*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

2、Linux系統下定時任務軟體種類

(1)at适合執行一次就結束的排程任務。依賴服務atd

(2)anacron适合于非7*24小時開機的服務準備。anacron并不能指定具體時間執行任務工作,而是以天為周期或者在系統每次開機後執行的任務工作,它會檢測伺服器停機期間應該執行,但沒有執行的任務工作,并将該任務執行一遍。

(3)crond,crond服務預設情況(每分鐘),會檢查系統中是否有需要執行的定時任務,若有會根據定義好的規則來執行這個定時任務。

注:

(1)crond服務是運作的程式,而crontab指令使用者用來設定定時規則的指令

(2)crond服務是企業生産工作中常用的重要服務,at和anacron很少使用,可以忽略。

1、文法指令

crontab [-u user] {-l | -e | -r |-i}

檢視幫助

[root@ysolin ~]# crontab --help

crontab: invalid option -- '-'

crontab: usage error: unrecognized option

usage:     crontab [-u user] file

      crontab [-u user] [ -e | -l | -r ]

           (default operation is replace, per 1003.2)

      -e    (edit user's crontab)

      -l    (list user's crontab)

      -r    (delete user's crontab)

      -i    (prompt before deleting user's crontab)

      -s    (selinux context)

2、指令說明

         通過crontab我們可以在固定的間隔時間執行指定的系統指令或script腳本。時間間隔的機關是分、時、日、月、周及以上的任意組合。

3、使用者權限檔案

    檔案                            說明

    /etc/cron.deny         #該檔案中所列使用者不允許使用crontab指令

    /etc/cron.allow        #該檔案中所列使用者允許使用crontab指令,優先于/etc/cron.deny

    /etc/spool/cron/      #所有使用者crontab配置檔案預設都存在此目錄,檔案名以使用者名指令

    注:

    crontab -e = vi /var/spool/cron/root

    crontab -l = cat /var/spool/cron/root

4、指令選項說明含義表

         -e      (edit user's crontab)                                              #編輯crontab檔案内容

         -l       (list user's crontab)                                                #檢視crontab檔案内容

         -r      (delete user's crontab)                                         #删除crontab檔案内容

         -i       (prompt before deleting user's crontab)          #删除crontab檔案内容,删除前會提示。

         -u               #指定使用的使用者執行任務

5、指令的使用格式

         (1)crond文法格式中時間段的含義

[root@ysolin ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# For details see man 4 crontabs

# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name command to be executed

         (2)crontab文法格式中特殊符号含義

*    # *号,表示任意時間,如每分、每小時、每日、每月、每周

   -    # 減号,表示分隔符,表示一個範圍區間

,    # 逗号,表示分割時間段的意思。

/n    # n代表數字,即“每隔n機關時間”

         (3)crontab依賴服務

[root@ysolin ~]# chkconfig --list crond

crond            0:off 1:off 2:on  3:on  4:on  5:on  6:off

[root@ysolin ~]# /etc/init.d/crond status

crond (pid  1430) is running...

[root@ysolin ~]# ps -ef |grep crond | grep -v grep

root       1430      1  0 Jun28 ?        00:00:00 crond

[root@ysolin ~]# /etc/init.d/crond restart

Stopping crond:                                            [  OK  ]

Starting crond:                                            [  OK  ]

範例1:每五分鐘同步一次系統時間

[root@ysolin ~]# vi /var/spool/cron/root

[root@ysolin ~]# echo 'time sync by solin' >>/var/spool/cron/root

[root@ysolin ~]# echo '*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1' >>/var/spool/cron/root

[root@ysolin ~]# crontab -l

範例2:每個月1、10、20日的淩晨3:30分重新開機apache

30 3 1,10,20 * * /application/apache/bin/apachectl graceful

         1、規範定時任務兩例(練習)

         (1)每分鐘列印一次solil到/var/log/solin.log中

[root@ysolin ~]# crontab -e

      添加任務

      #print my name to log

      * * * * * echo solil >>/var/log/solin.log

#time sync by solin

#print my name to log

* * * * * echo solil >>/var/log/solin.log

[root@ysolin ~]# cat /var/log/solin.log

solil

         (2)周期任務使用腳本每周六、日上午九點和下午兩點(周期)列印時間(格式:****-**-**)

建立腳本

[root@ysolin ~]# date +%F

2016-06-29

[root@ysolin ~]# echo 'date +%F' >scripts/date.sh

[root@ysolin ~]# cat scripts/date.sh

date +%F

[root@ysolin ~]# sh scripts/date.sh

設定定時任務

[root@ysolin ~]# echo "#print date " >>/var/spool/cron/root

[root@ysolin ~]# echo "00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1" >>/var/spool/cron/root

[root@ysolin ~]# crontab -l |tail -2

#print date

00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1

注:確定調用的指令是可執行的;路徑需要絕對路徑

2、書寫crond定時任務基本要領

(1)為定時任務指令加必要的注釋

  寫定時任務規則時盡可能的加上注釋(最好是英文英文注釋),友善後期更高改,其他運維人員了解定時任務的内容

(2)執行腳本任務前加/bin/sh

  執行定時任務時,如果是執行腳本,請盡量在腳本後面帶上/bin.sh指令,防止腳本沒有執行權限而出錯

(3)定時任務指令或腳本結尾加>/dev/null 2>&1

  2>&1表示讓标準錯誤和标準輸出一樣,即把腳本正常和錯誤輸出都都重定向到/dev/null,不記錄任何輸出。

  >/dev/null 2>&1等價于1>/dev/null 2>/dev/null 等價于 &>dev/null

  如果定時任務規則結尾不加>/dev/null 2>&1,很容易導緻inode磁盤空間被占滿,進而系統服務不正常。

(4)定時任務或層序最好在腳本裡執行

(5)在指令使用者下執行相關定時任務

  需要root權限執行的任務可以登入到root使用者然後設定,如果不需要root權限,可以登入到普通使用者(也可以直接在root下c’ron’tab -u solin -e的方式直接設定)設定。不同使用者環境問題:如果調用了環境變量/etc/profile (如生産環境中java程式的定時任務),最好在程式腳本中,将用的到環境變量重新export下

(6)生産任務程式不要随意列印輸出資訊

  在開發定時任務程式或腳本時,在調試好腳本程式後,應盡量把DEBUG及指令輸出的内容資訊屏蔽掉,如果确實需要輸出日志,可定向指定日志檔案,避免産生系統垃圾。

(7)定時任務執行的腳本要規範路徑/server/scripts

(8)配置定時任務規範操作過程,防止出錯。

  首先要在指令行操作成功,然後複制成功的指令到腳本裡,減少配置定時任務錯誤;

  然後測試腳本,測試成功後,複制腳本的規範路徑到定時任務裡;

  現在測試環境下測試,然後正式環境規範部署。

         3、系統定時任務配置

輪詢日志

[root@ysolin ~]# ll /var/log/messages* #系統報錯日志

-rw-------. 1 root root 201538 6月  29 19:48 /var/log/messages

[root@ysolin ~]# ll /var/log/secure* #安全資訊和系統登入與網絡連接配接的資訊

-rw-------. 1 root root 8562 6月  29 23:43 /var/log/secure

-rw-------. 1 root root 6490 6月  26 01:45 /var/log/secure-20160626

[root@ysolin ~]# ls /etc/cron.daily/

logrotate

[root@ysolin ~]# cat /etc/cron.daily/logrotate # logrotate 程式是一個日志檔案管理工具

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi

exit 0

[root@ysolin ~]# cat /etc/logrotate.conf # logrotate 的配置檔案

# see "man logrotate" for details

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# create new (empty) log files after rotating old ones

create

# use date as a suffix of the rotated file

dateext

# uncomment this if you want your log files compressed

#compress

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here

/var/log/wtmp {

    monthly

    create 0664 root utmp

      minsize 1M

    rotate 1

}

/var/log/btmp {

    missingok

    create 0600 root utmp

# system-specific logs may be also be configured here.

         4、企業生産環境如何調試crond定時任務(個人建議)

         (1)增加執行頻率調試任務

                   在調試時,把任務執行周期縮短,測試出定時任務效果

                   規範的操作流程(開發和運維人員):

                            個人的開發配置環境è辦公室的測試環境èIDC機房的測試環境èIDC機房的正式環境

         (2)調整系統時間調試任務(不能用于生産環境)

                   把系統的時間調整為定時任務執行的前五分鐘,確定定時任務能夠正确執行。

         (3)通過日志輸出調試定時任務

                   在腳本中加入日志輸出,然後把輸出打到指定的日志中,然後觀察日志内容結果,看是否執行或正确執行。

         (4)注意一些任務指令帶來的問題

          如:*/1 * * * * * echo “Hello Word” >> /tmp/solin.log >/dev/null 2>&1

        因前面已經有了重定向,後面要去掉/dev/null 2>&1

         (5)注意環境變量導緻的定時任務故障

                   在調試java程式的時候,注意環境變量,把環境變量的定義加到腳本裡

         (6)通過crond定時任務服務日志調試定時任務

[root@ysolin ~]# tail -f /var/log/cron

Jun 30 02:00:01 ysolin CROND[3537]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:01:01 ysolin CROND[3541]: (root) CMD (run-parts /etc/cron.hourly)

Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3541]: starting 0anacron

Jun 30 02:01:01 ysolin anacron[3550]: Anacron started on 2016-06-30

Jun 30 02:01:01 ysolin anacron[3550]: Jobs will be executed sequentially

Jun 30 02:01:01 ysolin anacron[3550]: Normal exit (0 jobs run)

Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3552]: finished 0anacron

Jun 30 02:05:01 ysolin CROND[3555]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:10:01 ysolin CROND[3559]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:15:01 ysolin CROND[3563]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

1、系統環境變量問題

2、定時任務絕對路徑

3、腳本權限問題加/bin/sh

4、時間變量問題用反斜線

5、>/dev/null 2>&1,防止磁盤空間(inode)被占滿

6、定時任務規則之前加注釋

7、使用腳本程式代替指令行定時任務

8、避免不必要的程式及指令輸出

9、切到目标目錄的上一級打包目标

10、定時任務腳本中的程式指令用全路徑

1、No space left on davice生産環境故障

問題描述:

      工作中設定crontab定時任務時任務規則儲存時,提示“No space left on davice”,此時df -h檢查磁盤,發現磁盤有空餘空間,用df -i檢查則發現/var目錄已占用100%的inode數量。

最後檢查發現/var/spool/clientmqueue/下有大量的檔案,執行cd /var/spool/clientmqueue ;rm -f * 自動跳出,無法删除

故障分析:

      當系統中crond定時任務執行的程式有輸出内容時,輸出的内容會以郵件的形式放送給crond的使用者(預設是root),而sendmail等服務沒有開啟的時,這些郵件内容就會在郵件隊列臨時目錄中産生檔案,導緻消耗inode數量,一旦indode數量耗盡就會導緻系統無法寫入檔案而報錯:No space left on davice

解決方式:

(1)删除目錄或檔案

[root@ysolin ~]# cd /var/spool/clientmqueue && ls |xargs rm -f

或者

[root@ysolin ~]# cd /var/spool && rm -rf clientmqueue

[root@ysolin ~]# mkdir clientmqueue && chmod 770 clientmqueue && chown smmsp.smmsp -R /var/spool/clientmqueue

(2)修改定時任務,添加 >/dev/null 2>&1

2、No space left on davice生産環境故障

理論:

inode譯成中文就是索引節點,每個儲存設備(例如硬碟)或儲存設備的分區被格式化為檔案系統後,應該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲資料用的。

而inode,就是用來存儲這些資料的資訊,這些資訊包括檔案大小、屬主、歸屬的使用者組、讀寫權限等。inode為每個檔案進行資訊索引,是以就有了inode的數值。作業系統根據指令,能通過inode值最快的找到相對應的檔案。

常見問題:No space left on device

解決思路

(1)檢視分區使用情況:

[root@ysolin ~]# df -lk

檢視分區使用情況

(2)檢視inode使用資訊:

[root@ysolin ~]# df -i

#檢視inode使用資訊

(1)find鎖定占用空間最大的目錄(通常目錄大小越大,表示目錄下的檔案越多)

(2)删除多餘的inode節點。(find /xxx -type f -exec rm {} \;)

如:

檢視系統空間使用最多的檔案

find / -type f -size -1k | xargs -i dirname {} | sort  -nr| uniq -c | sort -nr | tail

删除:(一定要确定是自己的站點,而且所删除的東西已經不重要)

find /路徑/路徑 -size -1k -type f | xargs rm -f

本文轉自 運維小當家 51CTO部落格,原文連結:http://blog.51cto.com/solin/1860317,如需轉載請自行聯系原作者

繼續閱讀