Linux計劃任務執行結果和手動執行不一致,發生原因有三種:
以下是計劃任務和腳本情況介紹,寫出具體代碼是爲了說明第三種情況
[root@salt-master 09]# crontab -l
*/1 * * * * /bin/sh /root/test03/09/01.sh >/dev/null 2>&1
*/1 * * * * /bin/sh /root/test03/09/02.sh >/root/test03/09/03.txt 2>&1
[root@salt-master 09]# cat 01.sh
#!/bin/bash
A=`cat /root/test03/09/03.txt`
echo $A
[root@salt-master 09]# cat 02.sh
#!/bin/bash
ls /root/test03/09/*
[root@salt-master 09]# cat 03.txt
/root/test03/09/01.sh
/root/test03/09/02.sh
/root/test03/09/03.txt
1、腳本中命令未使用絕對路徑
一般系統命令沒有這個問題,但是一些編譯安裝的服務命令,如果沒有寫入環境變量,則會導致調用失敗,這時候要麼寫入環境變量的配置文件,並source文件;要麼寫上絕對路徑。
例如編譯安裝的mysql,可以使用絕對路徑/usr/local/bin/mysql ,則可以避免這個問題,其他命令也一樣。
2、crontab配置文件中未使用絕對路徑
例如腳本01.sh,如果只寫*/1 * * * * sh 02.sh ,腳本執行一定會報錯,這裏有個小注意點就是02.
sh的權限問題,如果有可執行權限,可以省略寫 */1 * * * * /root/test03/09/02.sh
如果沒有可執行權限,則一定要這麼寫 */1 * * * * /bin/sh /root/test03/09/02.sh
3、最爲特殊的情況,只因爲兩個計劃任務都是每分鐘執行一次,且01.sh依賴02.sh的輸出結果,導致01.sh腳本執行完結果爲空
將計劃任務修改如下
[root@salt-master 09]# crontab -l
*/1 * * * * /bin/sh /root/test03/09/01.sh >> /root/test03/09/04.txt 2>&1
04.txt輸出如下:
[root@salt-master 09]# tail -f 04.txt
++ cat /root/test03/09/03.txt
+ A=
+ echo
此時,可以發現A的結果爲空,而手動執行結果如下:
[root@salt-master 09]# sh -x 01.sh
++ cat /root/test03/09/03.txt
+ A='/root/test03/09/01.sh
/root/test03/09/02.sh
/root/test03/09/03.txt
/root/test03/09/04.txt'
+ echo /root/test03/09/01.sh /root/test03/09/02.sh /root/test03/09/03.txt /root/test03/09/04.txt
/root/test03/09/01.sh /root/test03/09/02.sh /root/test03/09/03.txt /root/test03/09/04.txt
是不是很神奇,通過04.txt的輸出結果,可以發現01.sh腳本中A的變量輸出爲空,但是所有的地方都是用了絕對路徑,有的同學可以會懷疑環境變量的影響,我這邊已經證明,即便source /etc/profile也沒有作用,以爲與此無關。不相信的可以自行嘗試。
解決辦法:
在01.sh腳本中,第2行加上sleep 5
原因:
因爲兩個腳本都是每分鐘執行一次,推測可能在執行過程中,03.txt被鎖定,導致無法讀取內容,只要錯開這個時間,就能正常讀取結果。這是一種特殊情況導致的結果。