我們編寫好了一個shell腳本之后,直接運行腳本可以執行,但是用crontab做定時任務時卻無法自動執行
已經排除腳本文件的執行權限問題,通過日志也能看到定時任務有被正常執行,但是定時任務下的腳本卻沒有出結果,這種問題很大可能是環境變量的影響。
-
解決方法:
可以在腳本中最開始的部分加載下這些環境變量,例如腳本最開始的部分加上source /home/postgres/.bash_profile
另外腳本中的一些命令的應用最好也是寫成絕對路徑,例如find
可以寫成/usr/bin/find
-
引申
對於在一個shell腳本中調用另一個shell腳本文件,常用的有三種方法:- fork,直接調用,即在調用時新開一個shell,老的shell依舊存在,新shell執行完之后返回老的shell,新shell繼承老shell的環境變量,但是新shell中的環境變量不會帶回到老shell中;
- exec,這種方法不需要再新開一個shell,被調用的shell與父腳本在同一個shell內執行,但是使用exec調用腳本之后,父腳本中exec行之后的內容就不會再執行了;
- source,也可以直接寫成
.
,也是不需要新開一個shell,並且source行之后的內容依舊會再執行,這樣被調用的腳本中聲明的變量和環境變量都可以在主腳本中得到和使用。