為什麼 cron ENV 與使用者的 ENV 不同?

為什麼 cron ENV 與使用者的 ENV 不同?

在新安裝的 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

相關內容