crond定時任務詳細介紹

                  crond定時任務詳細介紹

1、定時任務crond介紹


1>定時任務軟件種類

at 適合僅執行一次就結束的調度命令,需要啓動一個後端的atd服務。

crontab 需要啓動一個服務crond才行,crond服務通過crontab命令實現。

anacron 無法週期性執行,只能以天爲週期,但有個特點,在關機狀態下未執行的任務,下次開機時可以補上執行

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

2>crontab工作

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

默認系統中可以登陸的用戶,都可以使用crontab定義計劃任務。不過,可以通過/etc/cron.allow文件限制權限。


3>crontab支持兩種狀態:

a.直接編寫計劃任務;

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


2crond定時任務限權

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


1)拒絕用戶使用crontab任務

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

listen

nobody

noaccess

username1

username2

username3

.


2)允許用戶訪問crontab任務

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

root

username1

username2

.


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

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

* 23-7/1 * * 25pxd

注:這是一個錯誤的命令

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

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

*/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)重啓crond服務

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

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

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


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



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