天天看點

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/目前使用者這樣的檔案。

注:

/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

3.2 定時任務指令或程式最好寫到腳本裡執行

#backup www to /backup

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

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

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

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

3.5 定時任務結尾加 >/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)

本文出自 “” 部落格,請務必保留此出處

繼續閱讀