您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何解決Linux中crontab定時(shí)任務(wù)未執(zhí)行的錯(cuò)誤,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
crontab 就是一個(gè)定時(shí)任務(wù)了。但有一些網(wǎng)友配置好crontab后發(fā)現(xiàn)第二天起來(lái)沒(méi)有執(zhí)行指定任務(wù)了,那么這個(gè)問(wèn)題有權(quán)限,限制等等原因,我們來(lái)給各位總結(jié)一下關(guān)于crontab不執(zhí)行的解決辦法。
沒(méi)有按照規(guī)范寫(xiě)以下的shell腳本導(dǎo)致執(zhí)行失敗通過(guò)CentOS中的定時(shí)任務(wù)執(zhí)行shell腳本失敗,進(jìn)行排查:
1)手動(dòng)執(zhí)行shell腳本(sh backup.sh)成功執(zhí)行,排除sh腳本的語(yǔ)法錯(cuò)誤。
2)通過(guò)nano /etc/crontab命令查看定時(shí)任務(wù),發(fā)現(xiàn)除過(guò)執(zhí)行sh的定時(shí)任務(wù)外,其他任務(wù)都能正常執(zhí)行。檢查其代碼,
發(fā)現(xiàn)對(duì)SHELL、PATH、MAILTO、HOME還沒(méi)有好好了解過(guò),以往都是注意下面的時(shí)間規(guī)則,所以查了一下定義:
1)SHELL,變量的值指定shell 環(huán)境(此處默認(rèn)為 bash shell);
2)PATH,變量定義用來(lái)執(zhí)行命令的程序路徑;
3)MAILTO,任務(wù)的輸出被郵寄給 MAILTO 變量定義的用戶(hù)名,如果變量被定義為空白字符串,電子郵件就不會(huì)被寄出;
4)HOME,變量可以用來(lái)設(shè)置在執(zhí)行命令或腳本時(shí)使用的主目錄;
隨后看到SHELL的定義先用env一下看一下系統(tǒng)默認(rèn)shell是哪個(gè)地址,
[root@AY data]# env
HOSTNAME=AY
TERM=xterm
SHELL=/bin/bash
...
隨后打開(kāi)shell腳本查看,果然沒(méi)有對(duì)shell腳本配置地址。好了,找到了一個(gè)問(wèn)題,下面就根據(jù)文檔說(shuō)明在shell腳本開(kāi)始的地方打上該shell地址,如我的env是SHELL=/bin/bash,那么shell腳本開(kāi)始就應(yīng)該如下:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
添加完后重啟服務(wù)service crond restart,檢查腳本運(yùn)行情況,順利執(zhí)行~
這次是按排除法檢查了錯(cuò)誤原因,主要還是由于沒(méi)有按照規(guī)范寫(xiě)下的shell腳本導(dǎo)致執(zhí)行失敗。
下面再列出幾個(gè)常見(jiàn)的沒(méi)有按規(guī)范編寫(xiě)shell會(huì)出現(xiàn)的問(wèn)題:
1)由于啟動(dòng)腳本用的是系統(tǒng)的crontab所以必須定義sh文件的目錄以及具體日志的具體路徑
2)注意使用加減法使用((num=$line+1))兩個(gè)括號(hào)來(lái)進(jìn)行弱類(lèi)型轉(zhuǎn)換
3)注意if判斷大小于使用[[]]來(lái)進(jìn)行,例如:if [[ $count > 0 ]],等于則可以使用一個(gè)[]即可
問(wèn)題解決思路:
1. 判斷crontab是否有執(zhí)行過(guò),你可以添加一個(gè)每分鐘執(zhí)行的寫(xiě)文件的小腳本進(jìn)行測(cè)試,如果有記錄說(shuō)明crontab本身服務(wù)沒(méi)有問(wèn)題.
如: Feb 7 14:45:01 1280859075761a8Z crond[13638]: (root) CMD (/backuptoqiniu/backuptoqiniu.sh )這里面應(yīng)該是表示crontab已經(jīng)成功執(zhí)行了的,所以crontab服務(wù)沒(méi)有問(wèn)題.
2. 其實(shí)有經(jīng)驗(yàn)多半就會(huì)知道crontab的執(zhí)行是沒(méi)有相關(guān)環(huán)境變量的,解決辦法就是在腳本中打日志,另外默認(rèn)將所有的命令采用全路徑的方式.
調(diào)試方法:添加日志文件,將原來(lái)所有的echo 全部可以嘗試追加到日志文件,或者在crontab寫(xiě)的時(shí)候追加日志.
45 14 * * * /backuptoqiniu/backuptoqiniu.sh >> /tmp/out.log 2>&1
ases.sql" -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS $DATEBASE > "$NOW-Datab
我就沒(méi)有看懂你這個(gè)是什么,是不是自己的命令不在默認(rèn)的系統(tǒng)命令里面.
測(cè)試方法: 測(cè)試crontab的PATH與手動(dòng)執(zhí)行的PATH不一樣.
可以在crontab的腳本里面添加個(gè)echo $PATH > /tmp/1.log
對(duì)比和你手動(dòng)的終端下執(zhí)行的echo $PATH
方法三,再看一個(gè)例子
crontab定時(shí)任務(wù)不執(zhí)行的原因1、腳本語(yǔ)法錯(cuò)誤在crontab腳本沒(méi)有定時(shí)執(zhí)行的時(shí)候,首先需要檢查腳本的語(yǔ)法有沒(méi)有出現(xiàn)問(wèn)題。
2、環(huán)境變量問(wèn)題有時(shí)我們創(chuàng)建了一個(gè)crontab,但是這個(gè)任務(wù)卻無(wú)法自動(dòng)執(zhí)行,而手動(dòng)執(zhí)行這個(gè)任務(wù)卻沒(méi)有問(wèn)題,這種情況一般是由于在crontab文件中沒(méi)有配置環(huán)境變量引起的。我們?cè)谑謩?dòng)執(zhí)行任務(wù)時(shí)是在當(dāng)前shell環(huán)境下進(jìn)行的,程序能夠找到環(huán)境變量,而系統(tǒng)自動(dòng)執(zhí)行任務(wù)調(diào)度時(shí),是不會(huì)加載任何環(huán)境變量的。因此,我們需要在shelll腳本中提供所有必要的路徑和環(huán)境變量。
需要注意的主要有以下三點(diǎn):
1)腳本中涉及文件路徑時(shí)寫(xiě)全局路徑;
2)腳本執(zhí)行要用到j(luò)ava或其他環(huán)境變量時(shí),通過(guò)source命令引入環(huán)境變量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)當(dāng)手動(dòng)執(zhí)行腳本OK,但是crontab死活不執(zhí)行時(shí)。這時(shí)必須大膽懷疑是環(huán)境變量惹的禍,并可以嘗試在crontab中直接引入環(huán)境變量解決問(wèn)題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
3、系統(tǒng)任務(wù)調(diào)度及用戶(hù)任務(wù)調(diào)度系統(tǒng)任務(wù)調(diào)度主要完成系統(tǒng)的一些維護(hù)操作,用戶(hù)任務(wù)調(diào)度主要完成用戶(hù)自定義的一些任務(wù),可以將用戶(hù)任務(wù)調(diào)度放到系統(tǒng)任務(wù)調(diào)度來(lái)完成(不建議這么做),但是反過(guò)來(lái)卻不行,root用戶(hù)的任務(wù)調(diào)度操作可以通過(guò)“crontab –uroot –e”來(lái)設(shè)置,也可以將調(diào)度任務(wù)直接寫(xiě)入/etc/crontab文件,需要注意的是,如果要定義一個(gè)定時(shí)重啟系統(tǒng)的任務(wù),就必須將任務(wù)放到/etc/crontab文件,即使在root用戶(hù)下創(chuàng)建一個(gè)定時(shí)重啟系統(tǒng)的任務(wù)也是無(wú)效的。
crontab定時(shí)任務(wù)不執(zhí)行的解決辦法
1、查看crontab執(zhí)行記錄如果出現(xiàn)了crontab定時(shí)任務(wù)不執(zhí)行的情況,首先需要定位問(wèn)題,那么就需要通過(guò)日志來(lái)確定問(wèn)題所在。
crontab的日志位置一般位于/var/log/cron,利用下面的語(yǔ)句即可查看日志。
tail -f /var/log/cron
上面的/var/log/cron只會(huì)記錄是否執(zhí)行了某些計(jì)劃的腳本,但是具體執(zhí)行是否正確以及腳本執(zhí)行過(guò)程中的一些信息linux會(huì)通過(guò)郵件形式發(fā)送到給該用戶(hù)。
對(duì)于root用戶(hù)該郵件記錄位于/var/spool/mail/root,通過(guò)以下命令可以查看最近的crontab執(zhí)行情況。
tail -f /var/spool/mail/root
mail郵件一般只會(huì)記錄腳本執(zhí)行成功與否,如果執(zhí)行失敗,無(wú)法給出進(jìn)一步的錯(cuò)誤信息,這時(shí)需要我們將語(yǔ)句執(zhí)行的錯(cuò)誤信息重定向至文件中,這樣可以很方便的查看錯(cuò)誤信息。下面就給出了一個(gè)簡(jiǎn)單的例子
0 6 * * * /root/script/ss.sh >> /root/for_crontab/mylog.log 2>&1
上述語(yǔ)句表示把錯(cuò)誤輸出和標(biāo)準(zhǔn)輸出都輸出到mylog.log中,在執(zhí)行的時(shí)候會(huì)將命令執(zhí)行的相關(guān)信息記錄至mylog.log文件中。
2、解決問(wèn)題在經(jīng)過(guò)上一步的問(wèn)題定位之后,就可以很容易找到問(wèn)題并解決。
上述內(nèi)容就是如何解決Linux中crontab定時(shí)任務(wù)未執(zhí)行的錯(cuò)誤,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。