Cronは、crontabを持つユーザーのパスを使用せず、代わりに独自のパスを持ちます。PATH=/foo/bar
crontabの先頭に追加することで簡単に変更でき、古典的な回避策は、cronによって実行されるコマンドへの絶対パスを常に使用することですが、cronのデフォルトPATHはどこで定義されていますか?
私はArchシステム(cronie 1.5.1-1)で次の内容のcrontabを作成し、Ubuntu 16.04.3 LTSボックスでも同じ結果をテストしました:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
印刷されたもの:
$ cat fff
/usr/bin:/bin
しかし、なぜ?デフォルトのシステム全体のパスはに設定され/etc/profile
ていますが、他のディレクトリが含まれています。
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
/etc/environment
または/etc/profile.d
に関連するものは他にありません。私が考えた他のファイルは、おそらくcronによって読み取られる可能性があります。
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
また/etc/skel
、当然のことながら、どの/etc/cron*
ファイルにも関連するものはなく、どのファイルにも設定されていません。
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
では、ユーザーcrontabのcronのデフォルトPATHはどこに設定されていますか?cron
それ自体がハードコーディングされていますか?このためのある種の構成ファイルを読み取りませんか?
/etc/profile
と同じ構文(var=value
)を使用しているので言及しただけなので、それはcron
十分に簡単で/etc/profile
あり、私の知る限り非常に広まっています。私が驚いたのは、どこにも設定されていないため、ハードコードされているように見えたことです。実際にそうであるように、ステファンは以下で説明しました。
zsh
インタラクティブシェルとして使用する人は気にしません/etc/profile
(これはに固有ですbash
)
profile
ファイルはログインシェルによってのみ読み取られるため、インタラクティブシェルは無関係です。これらは、インタラクティブな場合とそうでない場合があります。
strings
プログラムに対して実行すると、これらのハードコーディングされた値を見つけるのに役立つ場合があります。
cron
を見て/etc/profile
、または特定のシェルを気にする必要はありません。より良い質問は、なぜ(Linuxの場合)または(* BSDの)からcron
読み取らないのかということです。最終的には実装の詳細だと思います。PATH
login.defs
login.conf