Linux計劃任務執行結果和手動執行不一致

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被鎖定,導致無法讀取內容,只要錯開這個時間,就能正常讀取結果。這是一種特殊情況導致的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章