cronのPATHはどこに設定されていますか?


34

Cronは、crontabを持つユーザーのパスを使用せず、代わりに独自のパスを持ちます。PATH=/foo/barcrontabの先頭に追加することで簡単に変更でき、古典的な回避策は、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それ自体がハードコーディングされていますか?このためのある種の構成ファイルを読み取りませんか?


3
cronを見て/etc/profile、または特定のシェルを気にする必要はありません。より良い質問は、なぜ(Linuxの場合)または(* BSDの)からcron読み取らないのかということです。最終的には実装の詳細だと思います。PATHlogin.defslogin.conf
桂佐藤

@SatōKatsura確かに、私はそれ自体/etc/profileと同じ構文(var=value)を使用しているので言及しただけなので、それはcron十分に簡単で/etc/profileあり、私の知る限り非常に広まっています。私が驚いたのは、どこにも設定されていないため、ハードコードされているように見えたことです。実際にそうであるように、ステファンは以下で説明しました。
テルドン

zshインタラクティブシェルとして使用する人は気にしません/etc/profile(これはに固有ですbash
バジルスタリンケビッチ

2
@BasileStarynkevitchいいえ、bash 固有のものではありません!まったく逆です!読めないシェルもいくつかありますが(c-shell family AFAIK)、zshはそれらの1つではありません。信じられない場合は、zshのマンページを参照してください。いずれにしても、さまざまなprofileファイルはログインシェルによってのみ読み取られるため、インタラクティブシェルは無関係です。これらは、インタラクティブな場合とそうでない場合があります。
テルドン

1
stringsプログラムに対して実行すると、これらのハードコーディングされた値を見つけるのに役立つ場合があります。
jrw32982は、Monicaを

回答:


47

ソースコードにハードコードされています(リンクは現在のDebianを指しますcron—さまざまなcron実装を考えると、1つを選択するのは難しいですが、他の実装も同様です)。

#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH "/usr/bin:/bin"
#endif

#ifndef _PATH_DEFPATH_ROOT
# define _PATH_DEFPATH_ROOT "/usr/sbin:/usr/bin:/sbin:/bin"
#endif

cron構成ファイルからデフォルトのパスを読み取りません。PATH=cronジョブですでに使用しているパスの指定をサポートしているため、他の場所でデフォルトを指定する必要はないという理由があると思います。(ジョブエントリでパスが指定されていない場合は、ハードコードされたデフォルトが使用されます。)


_PATH_DEFPATH_ROOT定義が存在するにもかかわらず、Debian Stretchをecho $PATH > /testfile使用crontab -eしてルートのcrontabを編集した後、ルートのcrontabも使用することを確認しました(_PATH_DEFPATHつまり、/ usr / bin:/ bin)_PATH_DEFPATH_ROOT 。これは、この回答(_PATH_DEFPATH_ROOT使用されていない)の2番目のソースコードリンクでも確認されています。この孤立した定義がバグであるかどうかは明確ではありません。
njahnke

8

Stephen Kittの回答に加えてPATH、Ubuntuでcron を設定する構成ファイルがあり、ハードコードされたデフォルト(またはcrontab自体で設定されたs)を使用cron することPATH無視しますPATH。ファイルは/etc/environmentです。注cronのPAM構成:

$ cat /etc/pam.d/cron
...   
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session       required   pam_env.so

# In addition, read system locale information
session       required   pam_env.so envfile=/etc/default/locale
...

これは簡単に検証できます。/etc/environmentたとえばfoo=bar、変数をenv > /tmp/foocronjobとして実行foo=barし、出力に表示されるように監視します。


しかし、なぜ?デフォルトのシステム全体のパスは/ etc / profileに設定されていますが、他のディレクトリが含まれています。

$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"

これはArch Linuxにも当てはまりますが、UbuntuではベースPATHはに設定されてい/etc/environmentます。/etc/profile.d既存のファイルにタックしていて、でファイルにPATH追加できます~/.pam_environment。私が持っているアーチの行動について提出されたバグを

残念ながら、/etc/pam.d/cronからの読み取りは含まれません~/.pam_environment。奇妙なことに、そのファイル/etc/pam.d/atd 含まれています:

$ cat /etc/pam.d/atd
#
# The PAM configuration file for the at daemon
#

@include common-auth
@include common-account
session    required   pam_loginuid.so
@include common-session-noninteractive
session    required   pam_limits.so
session    required   pam_env.so user_readenv=1

...しかし、コマンドatは、atジョブの作成時に使用可能な環境を継承しているようです(たとえば、env -i /usr/bin/at ...非常にクリーンな環境でジョブを実行しているようです)。

/etc/pam.d/cron持っているuser_readenv=1ように修正しても問題はないようで、変数が~/.pam_environment正常に表示され始めました(PATHもちろん、を除く)。


cronの環境変数を設定するのは面倒な作業のようです。継承された環境変数のどれがcronが(ソースを読み取らずに)無視するかを知らないという理由だけで、最良の場所はジョブ仕様自体にあるようです。


atジョブに関しては、ジョブをダンプするとat、ジョブが作成されたときの環境に一致するように環境が明示的に設定されることがわかります。
スティーブンキット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.