如下是計劃任務和腳本狀況介紹,寫出具體代碼是爲了說明第三種狀況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
例如腳本01.sh,若是隻寫/1 sh 02.sh ,腳本執行必定會報錯,這裏有個小注意點就是02.
sh的權限問題,若是有可執行權限,能夠省略寫 /1 /root/test03/09/02.sh
若是沒有可執行權限,則必定要這麼寫 /1 * /bin/sh /root/test03/09/02.shbash
將計劃任務修改以下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