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
を使用しないのはなぜですか?
質問(なぜそうなのか)に関しては、それを説明するマニュアルページはcrontab(5)
であり、IOWはman 5 crontab
からアクセスできます(セクション1のデフォルトではありません)。 cronデーモンはシェルセッションをエミュレートしようとせず、cronジョブを実行するためのクリーンで最小限の環境をセットアップし、次にcrontabファイルが独自の任意の環境変数を設定できるようにします。 Debianに同梱されている新しいcronデーモンには、pam_env
などの追加のプロビジョニングもいくつかあります。
Cronはログインシェルでプロセスを実行しません。このため、プロセスの実行時にすべての一般的なスクリプトが提供されるわけではありません。
ログインシェル内からプロセスを実行すると、ユーザーの環境が複製されます。
このようなものをcrontabに入れて、2つの出力を比較します。
*/1 * * * * /usr/bin/env > /tmp/env
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv
ご覧のとおり、/tmp/bashenv
には、/tmp/env
にはない環境変数が多数含まれています。これは、env
がbash -l
を使用してログインシェルで呼び出されたためです。