iT邦幫忙

1

crontab 沒有執行

大家好,
我在使用crontab執行shell檔案時,因為環境不同的關係,所以沒有正常執行。
但是手動在terminal卻可以動,log檔看了是寫找不到shell裡面所需程式的license,
其license我寫在 ~/.bashrc中,
代表手動執行找得到license,並且可以執行,
我也有試過 crontab -e 仍無法執行,

故想請問如何將user的環境提供給crontab使用?

5
raytracy
iT邦大神 1 級 ‧ 2020-05-23 05:17:42
最佳解答

crontab:

SHELL=/bin/bash
0 * * * * source /home/user/.bashrc; <your_command_here>

或是:

BASH_ENV="/home/user/.bashrc"
0 * * * * <your_command_here>

(但這個比較危險, 因為全部的 job 都會跑去吃你的 .bashrc)

kay_wu iT邦新手 5 級 ‧ 2020-05-23 13:27:22 檢舉

大大謝謝您的回覆,我想請問法2
"全部的 job 都會跑去吃你的 .bashrc"
是指每個cron job都會去根據.bashrc的環境來執行,
代表root的最高權限環境也會用user去跑嗎 ? 還是會有什麼風險?
謝謝您~

這種就自己測試,上面的方式,就是大家都用一個.我的方式就是各個使用者,使用各自的,這就是有兩種方式,可以看情況使用.UNIX是很活的,
這篇有四個接力把方法原理,注意事項都說明了.你應該是設法去領會體會,而不是拘泥於字面的注意小心,因為資深的會知道,可以透過某些
設定,進而做某些調整,這可以是正面,當然也可以是做反面用途.
上面所謂的危險,有可能是,你為了改某個設定,修改了設定的.bashrc,
但是卻是整組通用,那有可能別的使用者的 script 不能跑,或是得到不可預期的權限,這當然會有一定程度的風險.

kay_wu iT邦新手 5 級 ‧ 2020-05-24 14:22:23 檢舉

謝謝大大的回覆,因為看到字面上的說明,深怕使用了會整個掛掉,怕連系統時間校正等等都不會動,經過您回覆後,更加清楚這句意思了~謝謝您

1
清心明月
iT邦新手 4 級 ‧ 2020-05-23 01:17:23

這個跟 path有関
因為你在 ~/.bashrc中的任何path,
cronjob 是不一定會用的,
要考慮 cronjob, 是否用 bash shell 執行你的程式?
是否用root的 cronjob?
若你用 root的 cronjob, ~/.bashrc 你這個是 root的嗎?

說那麼多就是在 crontab把 path寫好一點或程式碼中的 path寫好一點,不要太依賴 ~/.bashrc 中的 path

手動能用,是因為, ~/.bashrc的path齊全。crontab不能執行,是因為找不到path

kay_wu iT邦新手 5 級 ‧ 2020-05-23 13:24:02 檢舉

謝謝大大回覆,是的,這是我目前遇到的問題,因此發文想詢問有沒有方法可以讓crontab 找到path!!

4
一級屠豬士
iT邦高手 1 級 ‧ 2020-05-23 08:53:27

承 清心明月 與 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 也示範了一種.
你可以試試看,再回饋結果,讓這篇可以讓以後的網友參考.

kay_wu iT邦新手 5 級 ‧ 2020-05-23 15:10:36 檢舉

謝謝大大分享~ 配合您的與前兩位大大方法一起服用,解決這問題了

1
浩瀚星空
iT邦大師 1 級 ‧ 2020-05-23 14:01:08

一般如果是不同user身份的crontab。
我會使用該user身份去建立它的排程。

命令語法為「crontab -e -u{USER}」

這樣子可以確保其排程在跑時,是依此user的身份在跑。
這樣子「~」特殊路徑才可以正常對應。

不過一般來說,也盡量最好不要在shell去使用「~」這樣的特殊路徑指向。

所以我猜測,你因該是因為用了特殊路徑(~)導至無法正常取得需要的東西。
先試著用有身份別的建立crontab的方式。或許能解決你的問題。

kay_wu iT邦新手 5 級 ‧ 2020-05-23 15:09:44 檢舉

謝謝大大分享,這部分嘗試過~ 但沒有照我預期跑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所使用的身份是否是正確的才行。
如真沒辦法的情況下。那就統統都使用絕對路徑來跑。
也就是你目前的方式。

但如果是軟體呼叫的方式。還是建議用對等身份的方式處理。

kay_wu iT邦新手 5 級 ‧ 2020-05-24 14:18:18 檢舉

了解~ 在我測試下,不論crontab或shell都用絕對路徑,沒使用到「~」,但crontab會顯示找不到檔案,最後解決方法除了參考上述大大們的方法外,也直接把路徑用export直接寫到shell中~ 才解決,非常謝謝大大分享~

我要發表回答

立即登入回答