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
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.4執行shell腳本任務時前加/bin/sh
執行定時任務時,如果是執行腳本,盡量在腳本前面帶上/bin/sh命名,否則有可能因為忘了為腳本設定執行權限,進而無法完成任務。
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.5 定時任務結尾加 >/dev/null 2>&1
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)
本文轉自 chengxuyonghu 51CTO部落格,原文連結:http://blog.51cto.com/6226001001/1541358,如需轉載請自行聯系原作者