佐藤です。

Hiroki Kashiwazaki <r...@iic.hokudai.ac.jp> wrote
  in <86pqqkkz0b.wl%...@iic.hokudai.ac.jp>:

re> デーモンに対して HUP が送られた時,そのデーモンプロセスにとっての
re> 環境変数 PATH はどのように定まるのでしょう.
re>
re> というのも,また sysutils/munin-node に関する話題なのですが,先日
re> アップデートされて 1.4.5_5 になった折に /etc/newsyslog.conf 内の
re> munin-node に関するエントリーの bug fix も行われまして,きちんと
re> 毎晩 0 時に newsyslog から HUP が送られて log rotate が行われるよ
re> うになったのですが,それに伴って /sbin 下にある sysctl などを使う
re> プラグインが not found エラーを吐くようになりました.プラグインに
re> echo $PATH 1>&2 を仕込んでみたところ,HUP した時の PATH は /bin:
re> /usr/bin でした.この PATH はどこから来ているんでしょう.

 /bin:/usr/bin ではなくて /usr/bin:/bin ではないでしょうか?

 munin-node は、デーモンプロセスの管理に Net::Server モジュールを使っています。
 このモジュールの中には、SIGHUP を受けとった時に
 $PATH を全部クリアする処理が入っています。
 一方、$PATH が空の状態で /bin/sh が起動すると、_PATH_DEFPATH が設定されます。
 /usr/include/paths.h を読むと分かりますが、_PATH_DEFPATH は
 /usr/bin:/bin です。munin-node がプラグインを呼び出す時の $PATH が、
 SIGHUP の前後で変化するのは、これらが原因です。
 (cron や newsyslog を実行しているユーザの環境変数は関係ありません)

 プラグイン実行の際、munin-node 実行時のユーザの $PATH を継承する、という
 ところが、そもそもデザインとして今ひとつですし、SIGHUP の前後で
 $PATH の一貫性を維持することもしていないところをみると、
 ちゃんと考えられた結果ではないのでしょう。
 これは Munin 側のバグと言って良いのではないかと思います。

 修正のしかたはいろいろあると思いますが、
 プラグインの中でフルパスを使うのが一番無難だと思います。

-- Hiroki

Attachment: pgpPc0u3DAd5S.pgp
Description: PGP signature

メールによる返信