crontab 系列


crontab是一個很方便的在unix/linux系統上定時(循環)執行某個任務的程序使用cron服務,用 service crond status 查看 cron服務狀態,如果沒有啟動則 service crond start啟動它,cron服務是一個定時執行的服務,可以通過crontab 命令添加或者編輯需要定時執行的任務:

也就是說:linux/unix系統如果想運行cron任務,得先啟動crond服務;

 

5)重啟crond服務

 

/etc/init.d/crond status  #查看當前運行狀態

 

/etc/init.d/crond restart #重啟

 

/etc/init.d/crond reload  #平滑重啟

 

 或者 servie crond restart

 

crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數 eg: crontab -u root
crontab -l //列出某個用戶cron服務的詳細內容 
crontab -r //刪除某個用戶的cron服務 
crontab -e //編輯某個用戶的cron服務   //一般編輯當前登錄用戶,一個用戶只有一個cor文件,並已用戶名命名

比如說root查看自己的cron設置:crontab -u root -l

再例如,root想刪除fred的cron設置:crontab -u fred -r

在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e

進入vi編輯模式,編輯的內容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

編輯/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 這樣就將系統配置為了每天早上5點30自動重新啟動。

需要將crond設置為系統啟動后自動啟動的服務,可以在/etc/rc.d/rc.local 中,在末尾加上

service crond start

如果還需要在系統啟動十加載其他服務,可以繼續加上其他服務的啟動命令。

比如: service mysqld start

基本用法: 
1. crontab -l 
     列出當前的crontab任務 
2. crontab -d 
     刪除當前的crontab任務 
3. crontab -e (solaris5.8上面是 crontab -r) 
     編輯一個crontab任務,ctrl_D結束 
4. crontab filename 
     以filename做為crontab的任務列表文件並載入

crontab file的格式: 
    crontab 文件中的行由 6 個字段組成,不同字段間用空格或 tab 鍵分隔。前 5 個字段指定命令要運行的時間 
       分鍾 (0-59) 
       小時 (0-23) 
       日期 (1-31) 
       月份 (1-12) 
       星期幾(0-6,其中 0 代表星期日) 
       第 6 個字段是一個要在適當時間執行的字符串 
例子: 
      #MIN HOUR DAY MONTH DAYOFWEEK COMMAND 
      #每天早上6點10分 
      10 6 * * * date 
      #每兩個小時 
      0 */2 * * * date    (solaris 5.8似乎不支持此種寫法) 
      #晚上11點到早上8點之間每兩個小時,早上8點 
      0 23-7/2,8 * * * date 
      #每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 
      0 11 4 * mon-wed date 
      #1月份日早上4點 
      0 4 1 jan * date

執行秒級任務:

* * * * * /bin/date >>/tmp/date.txt
* * * * * sleep 10/bin/date >>/tmp/date.txt
* * * * * sleep 20/bin/date >>/tmp/date.txt
* * * * * sleep 30/bin/date >>/tmp/date.txt
* * * * * sleep 40/bin/date >>/tmp/date.txt
* * * * * sleep 50/bin/date >>/tmp/date.txt# backup mysql
%%執行:
00 01 * * * mysqldump -u root --password=passwd-d mustang > /root/backups/mustang_$(date +\%Y\%m\%d_\%H\%M\%S).sql
01 01 * * * mysqldump -u root --password=passwd-t mustang > /root/backups/mustang-table_$(date +\%Y\%m\%d_\%H\%M\%S).sql

一、cron在3個地方查找配置文件:
1、/var/spool/cron/ 這個目錄下存放的是每個用戶包括root的crontab任務,每個任務以創建者的名字命名,比如tom建的crontab任務對應的文件就是/var/spool/cron/tom。
一般一個用戶最多只有一個crontab文件。

二、/etc/crontab 這個文件負責安排由系統管理員制定的維護系統以及其他任務的crontab。

三、/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命令。

或者:

在/etc/cron.deny中添加要拒絕的用戶名,格式如下:

listen

nobody

noaccess

username1

username2

username3

.

 

2)允許用戶訪問crontab任務

在/etc/cron.allow中添加要允許的用戶名,格式如下:

root

username1

username2

在crontab文件中如何輸入需要執行的命令和時間。該文件中每行都包括六個域,其中前五個域是指定命令被執行的時間,最后一個域是要被執行的命令。
    每個域之間使用空格或者制表符分隔。格式如下: 
  minute hour day-of-month month-of-year day-of-week commands 
    合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要執行的腳本)
    除了數字還有幾個個特殊的符號就是"*"、"/"和"-"、",",*代表所有的取值范圍內的數字,"/"代表每的意思,"/5"表示每5個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字。

 

基本格式 :

*****command

分  時  日  月  周  命令

第1列表示分鍾1~59 每分鍾用*或者 */1表示

第2列表示小時1~23(0表示0點)

第3列表示日期1~31

第4列表示月份1~12

第5列標識號星期0~6(0表示星期天)

第6列要運行的命令

1)拒絕用戶使用crontab任務

2)定期執行一個目錄下的文件

在/etc/crontab中添加目錄,格式如下:

01 * * * * root run-parts 目錄

注:使用run-parts可定義定期執行的目錄

 

4)限權測試

1>添加用戶

[root@test ~]# useradd test

[root@test ~]# echo 123456 |passwd test--stdin  #<==非交互模式創建密碼

Changing password for user test.

passwd: all authentication tokensupdated successfully.

 

2>拒絕測試

[root@test ~]# cat /etc/cron.deny 

test

[root@test ~]# 

[root@test ~]# su - test

[test@test ~]$ crontab -e

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

在cron.deny中加入用戶后,該用戶沒有權限編輯定時任務

 

3>允許測試

[root@test ~]# cat /etc/cron.allow

test

[root@test ~]# su - test

[test@test ~]$ crontab -e   #<==test用戶編輯成功

*/1 * * * * echo successful >/tmp/a.log

[test@test ~]$ crontab -l

*/1 * * * * echo successful >/tmp/a.log

在cron.allow中加入用戶后,該用戶能編輯定時任務

 

4>清空允許用戶

[test@test ~]$ su - root

Password: 

[root@test ~]# echo >/etc/cron.allow

[root@test ~]# su - test

[test@test ~]$ crontab -l  #<==test用戶連查看的權限都沒有

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

[test@test ~]$ cat /etc/cron.deny

test

清空cron.allow允許用戶后,該用戶又被cron.deny拒絕,

得出結論:/etc/cron.allow優先於/etc/cron.deny配置

 

3Crontab用法

 

[root@yang1 data]# crontab --help   #<==注:crontab –l –e都是直接操作/var/spool/cron/下當前用戶名的文件

usage: crontab [-u user] file    #<==指定某用戶如crontab –u yang2 –e,編輯yang2家目錄下的crontab

    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 deletinguser's crontab) #<==刪除crontab文件內容,刪前會有提示

    -s   (selinux context)

注:crontab –e 編輯定時任務,退出時可以檢查語法,直接編輯/var/spool/cron/root不能。如果大批量添加任務,則使用echo追加。

cron執行的每一項工作都會被紀錄到/var/log/cron這個日志文件中,可以從這個文件查看命令執行的狀態。

 

4Crontab命令的書寫格式

 

  *      *     *      *     *    /bin/sh /scripts/yy.sh

  分     時     日     月     周    命令和文件路徑

(00-59)  (0-23)   (1-31)   (1-12)    (0-6)         

 

所用符號表示意思

星號每的意思

減號連續一段時間,如:00 17-19 * * * cmd  每天下午17點,18點,19點執行一次命令

逗號多個時間段,如:00 10-11,17-19 * * * cmd 每天的上午10,11點整,下午的17,18,19點整執行一次命令

/n n代表數字,指每隔n時間執行一次,如: */2 * * * * cmd 每隔2分鍾執行一次命令

 

1)舉例:

30 12-16/2 * ** cmd 

每天的中午12點到下午4點間,每隔2小時執行一次

其它如:小時上有值,則分鍾上也要有值

*/1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1

每隔一分鍾把yangrong打印到yangrong1文件中,但該命令無法執行,因為>>與>/dev/null不可同時使用

 

2)/dev/null 2>&1解釋

 

0是標准輸入    使用<或<<

1是標准輸出    使用>或>>

2是標准錯誤輸出  使用2>或2>>

>/dev/null 2>&1  即錯誤輸出與標准輸出全部重定向到空,可以寫成1>/dev/null 2>/dev/null

 

3)關於重定向的作用

重定向到空可以避免碎片文件占用inode資源

重定向到一個指定log里,可以看任務是否執行

 

4)關於導致磁盤inode滿情況分析

時任務執行成功or失敗時,程序會向上層發送mail,由於平時工作中不打開sendmail功能,所以郵件會存儲在臨時目錄/var/spool/clientmqueue,隨着執行的任務次數多,文件也會越來越多,直到某一天,添加文件時,提示No space left on device,主要問題原因不在於垃圾文件會占很大空間,而在於每個文件會占用inode節點。(centos6.4默認不裝sendmail,可能不會導致這個問題發生)。

所以crontab規則后需加 /dev/null 2>&1。

注:>> 與 >/dev/null 2>&1不可同時存在,不然無法執行

5、定時服務器時間同步

 

1)手動同步

[root@yang1 data]# which ntpdate

/sbin/ntpdate

[root@yang1 data]# /sbin/ntpdate time.windows.com

 

2)自動同步(使用定時任務)

#sync systime by yangrong at 2013-9-4         

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

注:當局域網內的服務器足夠多時(500+),則需自己在局域網搭建ntp server

 

 

6、寫定時任務注意點:

掌握了下面7點,寫定時任務就不在犯錯。

序號

注意點

1

每個任務添加注釋,誰寫的,什么時間寫的,完成什么需求?

2

執行腳本使用/bin/sh(防止腳本無執行權限),要執行的文件路徑是從根開始的絕對路徑(防止找不到文件)

3

盡量把要執行的命令放在腳本里,然后把腳本放在定時任務里。對於調用腳本的定時任務,可以把標准輸出錯誤輸出重定向到空。

4

定時任務中帶%無法執行,需要加\轉義

5

如果時上有值,分鍾上必須有值

6

日和周不要同時使用,會沖突

7

>>與>/dev/null 2>&1不要同時存在

書寫舉例:

#backup mysql byyangrong at 2013-9-4

30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1 

 

7、調試定時任務

一個任務不能輕易的直接推上線上服務器,需要在測試服務器上測試好。

 

序號

調試方法

1

增加頻率調試任務,如:生產環境2小時一次,測試機2分鍾一次

2

加快時間調試任務,如:生產環境1天后執行,則添加任務后修改設備時間

3

重定向到一個日志里,查看任務執行情況。一個是定時任務后加log,一個是腳本后加log

4

環境變量可能導致問題

5

通過日志定位問題。  tail /var/log/cron


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM