天天看點

linux crond定時任務詳細介紹

目錄

2、crond定時任務限權... 

3、Crontab用法... 

4、Crontab指令的書寫格式... 

5、定時伺服器時間同步... 

6、寫定時任務注意點..

7、調試定時任務... 

1>定時任務軟體種類

at 适合僅執行一次就結束的排程指令,需要啟動一個後端的atd服務。

crontab 需要啟動一個服務crond才行,crond服務通過crontab指令實作。

anacron 無法周期性執行,隻能以天為周期,但有個特點,在關機狀态下未執行的任務,下次開機時可以補上執行

注:crontab為最常用的定時任務。

2>crontab工作

運作linux後,開機自啟動crond任務,系統會每分鐘檢查是否有要執行的任務工作(循環檢測)

預設系統中可以登陸的使用者,都可以使用crontab定義計劃任務。不過,可以通過/etc/cron.allow檔案限制權限。

3>crontab支援兩種狀态:

a.直接編寫計劃任務;

b.使用目錄的方式,放在目錄裡面的都會定時執行,定時目錄可在/etc/crontab中設定。

可對各使用者使用定時任務進行管理

1)拒絕使用者使用crontab任務

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

listen

nobody

noaccess

username1

username2

username3

.

2)允許使用者通路crontab任務

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

root

3)定期執行一個目錄下的檔案

在/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@test ~]$ crontab -e   #<==test使用者編輯成功

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

[test@test ~]$ crontab -l

在cron.allow中加入使用者後,該使用者能編輯定時任務

4>清空允許使用者

[test@test ~]$ su - root

Password: 

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

[test@test ~]$ crontab -l  #<==test使用者連檢視的權限都沒有

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

清空cron.allow允許使用者後,該使用者又被cron.deny拒絕,

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

[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檔案内容,删前會有提示

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

cron執行的每一項工作都會被紀錄到/var/log/cron這個日志檔案中,可以從這個檔案檢視指令執行的狀态。

  *      *     *      *     *    /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小時執行一次

* 23-7/1 * * 25pxd 

注:這是一個錯誤的指令

日和周不能同時用,若要以月為間隔,則日或周必有一個有值

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

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

每隔一分鐘把yangrong列印到yangrong1檔案中,但該指令無法執行,因為>>與>/dev/null不可同時使用

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)重新開機crond服務

/etc/init.d/crond status  #檢視目前運作狀态

/etc/init.d/crond restart #重新開機

/etc/init.d/crond reload  #平滑重新開機

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

序号

注意點

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 

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

調試方法

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

加快時間調試任務,如:生産環境1天後執行,則添加任務後修改裝置時間

重定向到一個日志裡,檢視任務執行情況。一個是定時任務後加log,一個是腳本後加log

環境變量可能導緻問題

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

     本文轉自楊雲1028 51CTO部落格,原文連結:http://blog.51cto.com/yangrong/1288596,如需轉載請自行聯系原作者

繼續閱讀