大家好,
我在使用crontab執行shell檔案時,因為環境不同的關係,所以沒有正常執行。
但是手動在terminal卻可以動,log檔看了是寫找不到shell裡面所需程式的license,
其license我寫在 ~/.bashrc中,
代表手動執行找得到license,並且可以執行,
我也有試過 crontab -e 仍無法執行,
故想請問如何將user的環境提供給crontab使用?
crontab:
SHELL=/bin/bash
0 * * * * source /home/user/.bashrc; <your_command_here>
或是:
BASH_ENV="/home/user/.bashrc"
0 * * * * <your_command_here>
(但這個比較危險, 因為全部的 job 都會跑去吃你的 .bashrc)
大大謝謝您的回覆,我想請問法2
"全部的 job 都會跑去吃你的 .bashrc"
是指每個cron job都會去根據.bashrc的環境來執行,
代表root的最高權限環境也會用user去跑嗎 ? 還是會有什麼風險?
謝謝您~
這種就自己測試,上面的方式,就是大家都用一個.我的方式就是各個使用者,使用各自的,這就是有兩種方式,可以看情況使用.UNIX是很活的,
這篇有四個接力把方法原理,注意事項都說明了.你應該是設法去領會體會,而不是拘泥於字面的注意小心,因為資深的會知道,可以透過某些
設定,進而做某些調整,這可以是正面,當然也可以是做反面用途.
上面所謂的危險,有可能是,你為了改某個設定,修改了設定的.bashrc,
但是卻是整組通用,那有可能別的使用者的 script 不能跑,或是得到不可預期的權限,這當然會有一定程度的風險.
謝謝大大的回覆,因為看到字面上的說明,深怕使用了會整個掛掉,怕連系統時間校正等等都不會動,經過您回覆後,更加清楚這句意思了~謝謝您
這個跟 path有関
因為你在 ~/.bashrc中的任何path,
cronjob 是不一定會用的,
要考慮 cronjob, 是否用 bash shell 執行你的程式?
是否用root的 cronjob?
若你用 root的 cronjob, ~/.bashrc 你這個是 root的嗎?
說那麼多就是在 crontab把 path寫好一點或程式碼中的 path寫好一點,不要太依賴 ~/.bashrc 中的 path
承 清心明月 與 raytracy 兩位大大.
建議使用絕對路徑,與在script中設定相關參數.
若要去參考環境,還有一種作法,就是在 script 前面的 shebang
https://zh.wikipedia.org/wiki/Shebang
使用 env , 一般會先用 which env 查出路徑,例如是 /usr/bin/env
shebang 寫成
#!/usr/bin/env bash
這樣相關環境資料都會傳給 bash (shell), 或是呼叫 php, python 來執行script,這是
同樣的方式.
這只是其中一種方式, raytracy 也示範了一種.
你可以試試看,再回饋結果,讓這篇可以讓以後的網友參考.
一般如果是不同user身份的crontab。
我會使用該user身份去建立它的排程。
命令語法為「crontab -e -u{USER}」
這樣子可以確保其排程在跑時,是依此user的身份在跑。
這樣子「~」特殊路徑才可以正常對應。
不過一般來說,也盡量最好不要在shell去使用「~」這樣的特殊路徑指向。
所以我猜測,你因該是因為用了特殊路徑(~)導至無法正常取得需要的東西。
先試著用有身份別的建立crontab的方式。或許能解決你的問題。
謝謝大大分享,這部分嘗試過~ 但沒有照我預期跑XD
網路上資源都是說用絕對路徑,但用root跑絕對路徑他還是沒吃到bashrc用的環境~~crontab -e也試過所以我才提出這問題。
不過很謝謝您~
嗯?感覺您好像沒懂我的說明。
首先,crontab的建立,是可以區分不同身份排程來做建立的。
也就是說
crontab -e
與
crontab -e -u www
crontab -e -u root
這些都是代表不同的身份所建立的排程。
而依我的server來說明好了。
當我用root身份進入。
其「~」的路徑其實是在「/root」這個目錄內。
但當我用www身份。其「~」則是在「/var/lib/www」內
也就是說,其你得了解到一件事。當你在跑排程時的身份是誰。
其「~」路徑的對應就會不同。
如果說你用user身份下指令試跑命令的會是正常的。
且你的shell命令中有使用了「~」路徑指向。
那代表你得用user身份去跑這些指令處理。
但如果你今天使用crontab -e去建立的排程身份是root的身份。
一但排程在跑則會使用root的身份去跑這段排程。
這時的shell所指定的「~」是不同原來的路徑。那就一定會失敗的。
所以你得先知道你建立crontab所使用的身份是否是正確的才行。
如真沒辦法的情況下。那就統統都使用絕對路徑來跑。
也就是你目前的方式。
但如果是軟體呼叫的方式。還是建議用對等身份的方式處理。
了解~ 在我測試下,不論crontab或shell都用絕對路徑,沒使用到「~」,但crontab會顯示找不到檔案,最後解決方法除了參考上述大大們的方法外,也直接把路徑用export直接寫到shell中~ 才解決,非常謝謝大大分享~