來自老男孩教育的運維班面授課程內容,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