
在新安裝的 Ubuntu 上,使用者PATH
是:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
但在同一用戶的 cron 環境中,它是:
/usr/bin:/bin
我查看了主目錄中所有用戶的點文件,其中沒有任何內容更改了PATH
.
改變了什麼PATH
?為什麼 cron 不使用它PATH
?
答案1
關於這個問題 - 為什麼會這樣 - 解釋它的手冊頁是crontab(5)
,IOW 可以透過它存取man 5 crontab
(不是第 1 節中的預設頁)。 cron 守護程式不會嘗試模擬 shell 會話,而是為 cron 作業的運行設定一個乾淨、最小的環境,然後允許 crontab 檔案設定自己的任意環境變數。 Debian 附帶的較新的 cron 守護程序還具有一些額外的規定pam_env
等。
答案2
Cron 不會在登入 shell 中執行進程。因此,在執行進程時,不會取得所有典型腳本。
從登入 shell 中執行該程序應該複製使用者的環境。
將類似的內容放入 crontab 中並比較兩個輸出:
*/1 * * * * /usr/bin/env > /tmp/env
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv
正如您所看到的,/tmp/bashenv
將有一大堆/tmp/env
沒有的環境變數。這是因為env
是在登入 shell 中使用 呼叫的bash -l
。