Linux之定时任务补充
?
定時(shí)任務(wù)兩實(shí)例
例1: 每分鐘打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。
[root@chengliang log]# mkdir -p /server/log/ [root@chengliang log]# echo "chensiqi" >>/server/log/chengliang [root@chengliang log]# crontab -l #time sync by zcl at 2017/5/8 */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1 [root@chengliang log]# crontab -e ==>設(shè)置定時(shí)任務(wù),加上下面這兩句 #print my name to log by zcl at 2017/5/12 */1 * * * * /bin/echo "my name is zcl" >> /server/log/chengliang [root@chengliang log]#錯(cuò)誤示例:
#print my name to log by chensiqi at 2017211 */1 * * * * /bin/echo "chensiqi" >>/server/log/chensiqi >dev/null 2>&1 提示:這是一個(gè)錯(cuò)誤的定時(shí)任務(wù),請(qǐng)同學(xué)們思考錯(cuò)在了哪里?解答知識(shí)小結(jié):
1、定時(shí)任務(wù)要加注釋
2、如果已經(jīng)要定向到文件中,結(jié)尾不要有>/dev/null 2>&1
3、/server/log目錄必須要存在才能出結(jié)果,如沒有創(chuàng)建這個(gè)目錄。
4、定時(shí)任務(wù)中的路徑一定要絕對(duì)路徑
5、crond服務(wù)必須首先開啟
6、查看定時(shí)任務(wù)日志tail /var/log/cron
?
例2:每周六,日上午9點(diǎn)和下午14點(diǎn)(執(zhí)行/server/scripts/chensiqi.sh).要求:/server/scripts/chensiqi.sh腳本的功能是打印當(dāng)天的日期:格式為2017-02-11可以隨意。
解答:
##execute chengliang.sh by zcl at 2017/5/14 00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1步驟:
1、創(chuàng)建對(duì)應(yīng)的目錄
mkdir /server/scripts -p2、命令行測(cè)試
[root@chengliang log]# date +%F 2017-05-14 [root@chengliang log]#3、書寫腳本
[root@chengliang scripts]# echo 'date +%F' >/server/scripts/chensiqi.sh [root@chengliang scripts]# cat chengliang.sh date +%F [root@chengliang scripts]#4、命令行測(cè)試腳本
[root@chengliang scripts]# /bin/sh /server/scripts/chengliang.sh 2017-05-14 [root@chengliang scripts]#5、編輯定時(shí)任務(wù)(讓他快速執(zhí)行* * * * *)
crontab -e ==>增加下面的定時(shí)任務(wù) */5 * * * * /bin/sh /server/scripts/chensiqi.sh >>/server/log/chengliang.log6、測(cè)試
tail -f /server/log/chengliang.log 2017-5-147、按照原來的要求更改定時(shí)任務(wù)的時(shí)間
##execute chengliang.sh by zcl at 2017/5/14 00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1?
定時(shí)任務(wù)書寫要領(lǐng)
- 要領(lǐng)1:為定時(shí)任務(wù)規(guī)則加必要的注釋
加必要注釋:寫定時(shí)任務(wù)規(guī)則時(shí)盡可能的加上注釋(最好是英文注釋),這是個(gè)好的習(xí)慣和規(guī)范。
例如:誰在什么時(shí)間干了什么(注釋內(nèi)容)什么人,什么時(shí)間,因?yàn)槭裁?#xff0c;做了什么。如果這些都標(biāo)記清楚了,這樣其他的運(yùn)維人員可以很容易的理解任務(wù)的信息,從而提升團(tuán)隊(duì)的工作效率。
- 要領(lǐng)2:執(zhí)行shell腳本任務(wù)前加/bin/sh
執(zhí)行定時(shí)任務(wù)時(shí),如果是執(zhí)行腳本,請(qǐng)盡量在腳本前面加上/bin/sh命令,否則有可能因?yàn)橥藶槟_本設(shè)定執(zhí)行權(quán)限(x),從而以為OK了,結(jié)果無法完成任務(wù),這樣就“悲劇”了
- 要領(lǐng)3:定時(shí)任務(wù)命令或腳本的結(jié)尾加>/dev/null 2>&1
定時(shí)任務(wù)(一般是腳本任務(wù))規(guī)則的結(jié)尾最好加上>/dev/null 2>&1等內(nèi)容,如果需要打印日志,則可以追加到指定的日志文件里(此時(shí)不要和/dev/null同時(shí)存在),盡量不要留空。如果任務(wù)是命令的話,結(jié)尾使用“>/dev/null 2>&1”時(shí)要多測(cè)試下,要有檢查手段。如:*/1?* * * * echo "==" >>/tmp/chensiqi.log>/dev/null 2>&1 任務(wù)規(guī)則就是無法執(zhí)行的。
- 要領(lǐng)4:定時(shí)任務(wù)命令超過2條的命令執(zhí)行,最好用腳本文件
超過2條的命令執(zhí)行,最好用腳本文件。下面的方法就是不規(guī)范的,不專業(yè)的。
* * * * * sleep 1;echo chensiqi >> /server/log/chensiqi.log標(biāo)準(zhǔn)寫法:
[root@chensiqi /]# cat /server/scripts/log.sh sleep1 echo chensiqi >> /server/log/chensiqi.log-
要領(lǐng)7:定時(shí)任務(wù)命令或程序最好寫到腳本里執(zhí)行
-
要領(lǐng)8:定時(shí)任務(wù)執(zhí)行的腳本要規(guī)范路徑
- 例如:/server/scripts
- 要領(lǐng)9:配置定時(shí)任務(wù)規(guī)范操作過程,防止出錯(cuò)。
1,首先要在命令行操作成功,然后復(fù)制成功的命令到腳本里,在各個(gè)細(xì)小環(huán)節(jié)減少出錯(cuò)的機(jī)會(huì)。
2,然后測(cè)試腳本,測(cè)試成功后,復(fù)制腳本的規(guī)范路徑到定時(shí)任務(wù)配置里,不要手敲。
3,先在測(cè)試環(huán)境下測(cè)試,然后正式環(huán)境規(guī)范部署
?
在命令行輸入./chensiqi.sh(/server/scripts/chensiqi.sh)與sh chensiqi.sh區(qū)別在哪?
[root@chengliang scripts]# ls chengliang.sh [root@chengliang scripts]# sh chengliang.sh 2017-05-14 [root@chengliang scripts]# [root@chengliang scripts]# ./chengliang.sh -bash: ./chengliang.sh: Permission denied [root@chengliang scripts]#命令說明: sh chensiqi.sh表示用/bin/sh這個(gè)命令來解析并啟動(dòng)chensiqi.sh這個(gè)腳本。而./chensiqi.sh表示利用linux的默認(rèn)解釋器來解析并啟動(dòng)這個(gè)腳本。因此,./chensiqi.sh需要linux下x的執(zhí)行權(quán)限,而sh chensiqi.sh不需要
?
定時(shí)任務(wù)不加>/dev/null 2>&1的后果
- 如果定時(shí)任務(wù)規(guī)則結(jié)尾不加>/dev/null 2>&1等命令配置,有可能有大量輸出信息,時(shí)間長(zhǎng)了,可能由于系統(tǒng)未開啟郵件服務(wù)而導(dǎo)致郵件臨時(shí)目錄/var/spool/clientmqueue 文件數(shù)猛增的隱患發(fā)生,大量文件會(huì)占用大量磁盤inode節(jié)點(diǎn)(每個(gè)文件占一個(gè)inode),以致磁盤inode滿而無法寫入正常數(shù)據(jù)(下文有案例)。
- 提示:上面的>/dev/null 2>&1 寫法也可以寫成1>/dev/null 2>/dev/null,例:$JAVA-jar $RESIN_HOME/lib/resin.jar $ARGS stop 1>/dev/null 2>/dev/null?此寫法來自resin服務(wù)默認(rèn)啟動(dòng)腳本
- 上述是centos5.8的情況,假如系統(tǒng)不安裝sendmail(Centos6.4),那是不是就沒有上述問題了?
?
企業(yè)案例:如果定時(shí)任務(wù)規(guī)則結(jié)尾不加>/dev/null 2>&1,很容易導(dǎo)致硬盤inode空間被占滿,從而系統(tǒng)服務(wù)不正常。
當(dāng)一個(gè)定時(shí)任務(wù)執(zhí)行的時(shí)候,就會(huì)給系統(tǒng)發(fā)一封郵件。sendmail郵件服務(wù),經(jīng)常是關(guān)閉的,所以定時(shí)任務(wù)發(fā)送的郵件就會(huì)臨時(shí)堆在/var/spool/clientmqueue/,時(shí)間長(zhǎng)了,/var/spool/clientmqueue/文件數(shù)特別多。Centos5的時(shí)候一定會(huì)有這個(gè)問題。
Centos6呢?請(qǐng)往下看。
[root@chensiqi1 ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@chensiqi1 ~]# crontab -l #go to chensiqi trainning by chensiqi at 20170211 * * * * * /bin/sh /root/chensiqi.sh [root@chensiqi1 ~]# ls /var/spool/postfix/maildrop/ D3AD0C6 DB2BAC9 E14E6D0 E5222D1 [root@chensiqi1 ~]#命令說明:
定時(shí)任務(wù)沒定向到空,postfix服務(wù)沒有開啟的話,那么每執(zhí)行一次定時(shí)任務(wù),/var/spool/postfix/maildrop/文件夾下就會(huì)產(chǎn)生一個(gè)小文件,隨著時(shí)間累計(jì),就會(huì)越來越多,導(dǎo)致出現(xiàn)問題。 如果開啟了郵件服務(wù),就會(huì)直接給root發(fā)送郵件。
解決方法:
1、刪除大量小文件/var/spool/postfix/maildrop/下所有文件(ls|xargs rm -f)
2、臨時(shí)開啟postfix(sendmail)服務(wù)
3、vi /etc/crontab:將‘MAILTO=root’替換成‘MAILTO=“”’然后service crond restart即可。(如果還不行,crontab -e 第一行增加MAILTO=“”)
?
亡羊補(bǔ)牢:
定時(shí)任務(wù)定向到空>/dev/null 2>&1
| /var/spool/clientmqueue | centos5.xsendmail臨時(shí)郵件文件目錄,有很多原因會(huì)導(dǎo)致這個(gè)目錄碎文件很多,比如crontab定時(shí)任務(wù)命令不加>/dev/null等,并且sendmail服務(wù)沒開。工作中偶爾會(huì)因?yàn)樵撃夸浳募?#xff0c;導(dǎo)致/var所在的分區(qū)inode數(shù)量被消耗盡,無法寫入文件的情況 |
| /var/spool/postfix/maildrop/ | centos6.x?postfix臨時(shí)隊(duì)列目錄/var/spool/postfix/maildrop/默認(rèn)定時(shí)任務(wù)執(zhí)行時(shí)會(huì)給root發(fā)郵件,如果郵件服務(wù)不開,就會(huì)把郵件推到上述目錄。當(dāng)定時(shí)任務(wù)結(jié)尾不加>/dev/null 2>&1的時(shí)候,定時(shí)任務(wù)就會(huì)在上述目錄存大量小文件 |
?
定時(shí)任務(wù)的系統(tǒng)配置文件/etc/crontab
[root@chensiqi1 ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed- SHELL=/bin/bash #shell解釋器
- PATH=/sbin:/bin:/usr/sbin:/usr/bin #PATH環(huán)境變量
- MAILTO=root #定義如果任務(wù)有輸出,發(fā)給哪個(gè)用戶,默認(rèn)發(fā)給root用戶
- HOME=/ #定時(shí)任務(wù)執(zhí)行命令從根目錄開始
root用戶執(zhí)行crontab -e命令實(shí)際修改的是/var/spool/cron/root的root文件
[root@chengliang scripts]# cat /var/spool/cron/root #time sync by zcl at 2017/5/8 */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
增加執(zhí)行任務(wù)頻率調(diào)試任務(wù)(某些任務(wù)不能用于生產(chǎn)環(huán)境)
在調(diào)試時(shí),把任務(wù)執(zhí)行頻率調(diào)快一點(diǎn),如:每分鐘,每5分鐘執(zhí)行一次,或者比當(dāng)前時(shí)間推遲5分鐘以后,看能否執(zhí)行,是不是按照你想象的去執(zhí)行了,如果正常沒問題了,在改成需要的任務(wù)的執(zhí)行時(shí)間。
強(qiáng)調(diào):有些計(jì)劃任務(wù)是不允許頻繁執(zhí)行的,例如:定時(shí)往數(shù)據(jù)庫里插入數(shù)據(jù),這樣的任務(wù)就要在測(cè)試機(jī)上測(cè)試好,然后部署到正式線上,這樣正式工作出問題的機(jī)會(huì)就少了。
規(guī)范的公司開發(fā)和運(yùn)維人員操作流程,個(gè)人的開發(fā)配置環(huán)境-->辦公室的測(cè)試環(huán)境-->idc機(jī)房的測(cè)試環(huán)境-->idc機(jī)房的正式環(huán)境。
?
參考博客:?http://www.cnblogs.com/chensiqiqi/p/6389611.html
轉(zhuǎn)載于:https://www.cnblogs.com/0zcl/p/6852201.html
總結(jié)
以上是生活随笔為你收集整理的Linux之定时任务补充的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: runtime如何实现weak属性
- 下一篇: linux制作win7启动u盘