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)、つまり からアクセスできるページですman 5 crontab(セクション 1 のデフォルトのページではありません)。cron デーモンはシェル セッションをエミュレートしようとはせず、cron ジョブを実行するためのクリーンで最小限の環境を設定し、次に crontab ファイルが独自の任意の環境変数を設定できるようにします。Debian に同梱されている新しい cron デーモンには、pam_envなどのための追加の規定もいくつかあります。

答え2

Cron はログイン シェルでプロセスを実行しません。このため、プロセスの実行時にすべての一般的なスクリプトがソース化されるわけではありません。

ログイン シェル内からプロセスを実行すると、ユーザーの環境が複製されます。

次のような内容を crontab に入力し、2 つの出力を比較します。

*/1 * * * * /usr/bin/env > /tmp/env                                             
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv  

ご覧のとおり、 には、使用されていない/tmp/bashenv環境変数が多数あります。これは、 を使用してログイン シェルで が呼び出された/tmp/envためです。envbash -l

関連情報