linux定時任務crond那些事!

來自老男孩教育的運維班面授課程內容,17期依良同學作業整理而得!

1.定時任務crond介紹

1.1 crond是什麼

crond是linux系統中用來定期執行命令或指定程序任務的一種服務或軟件。

特殊需求:(秒級別)crond服務就無法搞定了,一般工作中寫腳本守護進程執行。

1.2 爲什麼要使用crond定時任務

linux系統的定時任務crond,相當於我們平時生活中的鬧鐘的功能。可以滿足週期性執行任務的需求。

1.3 不同系統的定時任務和種類

1.3.1 windows 7 系統的定時任務

開始→所有程序→附件→系統工具→選擇任務計劃程序

1.3.2 linux系統的定時任務

linux系統中定時任務調度的工作可以分爲以下兩個情況:

① linux系統自身定期執行的任務工作:系統週期性執行的任務工作,如輪詢系統日誌,備份系統數據,清理系統緩存等。

centos5.X例:

[root@CentOS5 log]# ll messages*

-rw------- 1 root root 372258 Mar 14 20:48 messages

-rw------- 1 root root 349535 Nov 11 18:13 messages.1

提示:centos 6.4日誌輪詢結尾是按時間了。

centos6.X例:

[root@CentOS6 log]# ll messages*

-rw------- 1 root root  1591 3月  25 21:57 messages

-rw------- 1 root root 78304 3月   3 20:40 messages-20140303

-rw------- 1 root root 78050 3月   8 19:42 messages-20140311

-rw------- 1 root root   745 3月  18 00:46 messages-20140318

-rw------- 1 root root 77232 3月  22 21:20 messages-20140325

 

② 用戶執行的任務工作:某個用戶或系統管理員定期要做的任務工作,例如每隔5分鐘和互聯網上時間服務器進行時間同步,每天晚上0點備份站點數據及數據庫數據,一般這些工作需要由每個用戶自行設置才行。

例:

[root@CentOS6 log]# crontab -l

#time sync by lee at 2014-1-14

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

 


2.定時任務crond使用說明

[root@CentOS6 log]# crontab --help

crontab:無效選項 -- -

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.1 指令說明

通過crontab我們可以在固定的間隔時間執行指定的系統指令或script腳本。時間間隔的單位是分鐘,小時,日,月,周及以上的任意組合(注意:日和周不要組合)

2.2 使用者權限及定時任務文件

文件

說明

/etc/cron.deny

該文件中所列用戶不允許使用crontab命令。

/etc/cron.allow

該文件中所列用戶允許使用crontab命令,優先於/etc/cron.deny

/var/spool/cron

所有用戶crontab配置文件默認都存放在此目錄,文件名以用戶名命名。

2.3 指令選項說明表

參數

含義

指定示例

-l(字母)

查看crontab文件內容

crontab -l

-e

編輯crontab文件內容

crontab -e

-i 

刪除crontab文件內容,刪除前會提示確認

crontab -ri

-r

刪除crontab文件內容

crontab -r

-u user

指定使用的用戶執行任務

crontab -u lee -l

提示:crontab{-l |-e}實際上就是在操作/var/spool/cron/當前用戶這樣的文件。

注:

crontab -e

/var/spool/cron/root

前者會檢查語法,而後者不會。

visudo

/etc/sudoers

前者會檢查語法,而後者不會。

 

2.4指令的使用格式

默認情況下,當用戶建立定時任務規則後,該規則記錄對應的配置文件會存在於/var/spool/cron中,其crontab配置文件對應的文件名與登錄的用戶名一致。如:root用戶的定時任務配置文件爲/var/spool/cron/root。

crontab用戶的定時任務一般分爲6段(空格分隔,系統的定時任務則/etc/crontab分爲7段),其中前五段位時間設定段,第六段爲所要執行的命令或腳本任務段

2.4.1 crontab基本格式

* * * * * cmd

提示:

① cmd爲要執行的命令或腳本,例如/bin/sh  /server/scripts/lee.sh.

② 每個段之間必須要有空格。

2.4.2 crontab語法格式中時間段的含義表

含義

取值範圍

第一段

代表分鐘

00-59

第二段

代表小時

00-23

第三段

代表日期

01-31

第四段

代表月份

01-12

第五段

代表星期

0-7(0和7都代表星期日)

2.4.3 crontab語法格式中特殊符號的含義表

特殊符號

含義

*

*號表示任意時間都,就是“每”的意思,舉例:如00 01 * * * cmd表示每月每週每日的凌晨1點執行cmd任務。

-

減號,表示分隔符,表示一個時間範圍段,如17-19點,每小時的00分執行任務。00 17-19 * * * cmd。就是17,18,19點整點分別執行的意思。

逗號,表示分隔時間段的意思。30 17,18,19 * * * cmd 表示每天17,18,19點的半點執行cmd。也可以和“-”結合使用,如: 30 3-5,17-19 * * * cmd

/n   

n代表數字,即每隔n單位時間,例如:每10分鐘執行一次任務可以寫 */10 * * * * cmd,其中 */10,*的範圍是0-59,也可以寫成0-59/10

 


3.書寫crond定時任務7個基本要領

3.1 爲定時任務規則加必要的註釋

加了註釋,就知道定時任務運行的是什麼作業,以防以後作業混亂。這是個好習慣和規範。

[root@angelT ~]# crontab -l

#time sync by lee at 2014-1-14

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

 

3.2 定時任務命令或程序最好寫到腳本里執行

[root@angelT ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

 

3.3定時任務執行的腳本要規範路徑,如:/server/scripts

[root@angelT ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

 

3.4執行shell腳本任務時前加/bin/sh

執行定時任務時,如果是執行腳本,儘量在腳本前面帶上/bin/sh命名,否則有可能因爲忘了爲腳本設定執行權限,從而無法完成任務。

[root@angelT ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

 

3.5 定時任務結尾加 >/dev/null 2>&1

[root@angelT ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

3.5.1 有關/dev/null的說明

/dev/null爲特殊的字符設備文件,表示黑洞設備或空設備。

[root@angelT ~]# ll /dev/null 

crw-rw-rw- 1 root root 1, 3 3月  26 01:10 /dev/null

3.5.2 有關重定向的說明

>或1>   輸出重定向:把前面輸出的東西輸入到後邊的文件中,會刪除文件原有內容。

>>或1>>追加重定向:把前面輸出的東西追加到後邊的文件中,不會刪除文件原有內容。

<或<0   輸入重定向:輸入重定向用於改變命令的輸入,指定輸入內容,後跟文件名。

<<或<<0輸入重定向:後跟字符串,用來表示“輸入結束”,也可用ctrl+d來結束輸入。

2>       錯誤重定向:把錯誤信息輸入到後邊的文件中,會刪除文件原有內容。

2>>     錯誤追加重定向:把錯誤信息追加到後邊的文件中,不會刪除文件原有內容。

標準輸入(stdin):代碼爲0,使用<或<<。

標準輸出(stdout):代碼爲1,使用>或>>。正常的輸出。

標準錯誤輸出(sederr):代碼爲2,使用2>或2>>。

特殊:

2>&1就是把標準錯誤重定向到標準輸出(>&)。

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

3.5.3 >/dev/null 2>&1的作用

如果定時任務規範結尾不加 >/dev/null 2>&1,很容易導致硬盤inode空間被佔滿,從而系統服務不正常var/spool/clientmqueue郵件臨時隊列目錄,垃圾文件存放於此,如果是centos 6.4系統,默認不裝sendmail服務,所以不會有這個目錄。

 

3.6 在指定用戶下執行相關定時任務

這裏要特別注意不同用戶的環境變量問題,如果是調用了系統環境變量/etc/profile,最好在程序腳本中將用到的環境變量重新export下。

 

3.7生產任務程序不要隨意打印輸出信息

在調試好腳本程序後,應儘量把DEBUG及命令輸出的內容信息屏蔽掉,如果確實需要輸出日誌,可定向到日誌文件裏,避免產生系統垃圾。

 

配置定時任務規範操作過程

①首先要在命令行操作成功,然後複製成功的命令到腳本里,在各個細小環境減少出錯的機會。

②然後測試小本,測試成功後,複製腳本的規範路徑到定時任務配置裏,不要手敲。

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

 


4.生產場景如何調試crond定時任務

規範的公司開發和運維人員操作流程:個人的開發配置環境-->辦公室的測試環境-->idc機房的測試環境-->idc機房的正式環境。

4.1 增加執行頻率調試任務

在調試時,把任務執行頻率調快一點,看能不能正常執行,如果正常,那就沒問題了,再改成需要的任務的執行時間。

注意:有些任務時不允許頻繁執行的,例如:定時往數據庫裏插入數據,這樣的任務要在測試機上測試好,然後正式線上出問題的機會就少了。

 

4.2調整系統時間調試任務

用正確的執行任務的時間,設置完成後,可以修改下系統當前時間,改成任務執行時間的前幾分鐘來測試(或者重啓定時任務服務)

4.3通過日誌輸出調試定時任務

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

4.4注意一些任務命令帶來的問題

注意: * * * * * echo ==>>/tmp/lee.log >/dev/null 2>&1 這裏隱藏的無法正確執行的任務配置,原因是前面多了>>,或者去掉結尾的 >/dev/null 2>&1。

4.5 注意環境變量導致的定時任務故障

例如:在調試java程序任務的時候,注意環境變量,把環境變量的定義加到腳本里。

4.6通過定時任務日誌調試定時任務

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

Mar 26 15:55:01 angelT CROND[3415]: (ida) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Mar 26 15:55:01 angelT CROND[3416]: (root) CMD (/usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1)

Mar 26 16:00:01 angelT CROND[3422]: (root) CMD (/usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1)

Mar 26 16:00:01 angelT CROND[3423]: (root) CMD (/usr/lib64/sa/sa1 1 1)

 

本文出自 “老男孩linux培訓” 博客,請務必保留此出處http://oldboy.blog.51cto.com/2561410/1410555


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