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

Linux計劃任務執行結果和手動執行不一致,發生緣由有三種:

如下是計劃任務和腳本狀況介紹,寫出具體代碼是爲了說明第三種狀況mysql

[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

一、腳本中命令未使用絕對路徑

通常系統命令沒有這個問題,可是一些編譯安裝的服務命令,若是沒有寫入環境變量,則會致使調用失敗,這時候要麼寫入環境變量的配置文件,並source文件;要麼寫上絕對路徑。
例如編譯安裝的mysql,能夠使用絕對路徑/usr/local/bin/mysql ,則能夠避免這個問題,其餘命令也同樣。sql

二、crontab配置文件中未使用絕對路徑

例如腳本01.sh,若是隻寫/1 sh 02.sh ,腳本執行必定會報錯,這裏有個小注意點就是02.
sh的權限問題,若是有可執行權限,能夠省略寫
/1 /root/test03/09/02.sh
若是沒有可執行權限,則必定要這麼寫 /1 * /bin/sh /root/test03/09/02.shbash

三、最爲特殊的狀況,只由於兩個計劃任務都是每分鐘執行一次,且01.sh依賴02.sh的輸出結果,致使01.sh腳本執行完結果爲空

將計劃任務修改以下ide

[root@salt-master 09]# crontab -l
*/1 * * * * /bin/sh /root/test03/09/01.sh  >> /root/test03/09/04.txt 2>&1

04.txt輸出以下:code

[root@salt-master 09]# tail -f 04.txt

++ cat /root/test03/09/03.txt
+ A=
+ echo

此時,能夠發現A的結果爲空,而手動執行結果以下:crontab

[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也沒有做用,覺得與此無關。不相信的能夠自行嘗試。it

解決辦法:

在01.sh腳本中,第2行加上sleep 5編譯

緣由:

由於兩個腳本都是每分鐘執行一次,推測可能在執行過程當中,03.txt被鎖定,致使沒法讀取內容,只要錯開這個時間,就能正常讀取結果。這是一種特殊狀況致使的結果。ast

相關文章
相關標籤/搜索