プログラム名が設定される。www」はプログラム名のようだ。www」なんてプログラムはいないぞ?syslog()関数の実装こうなると、identがNULLだったときのopenlog()の動きを知りたくなる。そこでglibcを見たところ、openlog()の実体はmisc/syslog.cにある。openlog()は内部のopenlog_internal()を呼び、ここでidentはLogTag変数に代入される。LogTagがNULLのときの処理を探してみると、syslog()のログ処理の実体である__vsyslog_chk()に以下の記述があった。__progname;__prognameは何かと見ると、頭のほうでexternで宣言されていた。「__progname」とはで、誰が__prognameをセットしているのかと探してみると「misc/init-misc.c」にあった。}}__prognameは「argv[0]の最後の'/'より後」のようだ。argv[0]の役目を考えると妥当そうに見える。__progname_fullとしてargv[0]も保持されている。php-fpmのargv[0]ってなんだっけ?phpが動作するのは、php-fpmプロセス。いえばphp-fpmは独自設定した文字列がpsで見えてたよなと見てみると、こうなっている。wwwphp-fpmは明らかにargv[0]を書き換えている。勘のいい人ならもうお分かりだろう。__progname_full);こんな風になる。(/etc/php5/fpm/php-fpm.conf)もう少しわかりやすくすると、こう。あった最後の/までの文字数分、新しい文字列の開始からスキップされている。wwwでどうなるかを想像するのはたやすいと思う。reportは作っておいた。PHPが対処すべき問題のように感じるけど、libcが文字列をコピーしておかないのが悪いって言われるとそうすかって感じなので、正直期待できない:https://bugs.php.net/bug.php?id=71544回避策:identに妥当な値を設定するには?暗黙のopenlog()をさせなければいい。期待のプログラムが動く前にopenlog()すればよい。具体的には、以下のようなファイルを例えば/etc/php5/fpm/fixsyslog.phpと置いて......php.iniのauto_prepend_fileで参照する。/etc/php5/fpm/fixsyslog.phpこれで常にopenlog()が呼ばれるので現象は起こらない。原因に関しては、ソースを追うことですっきりさせることができた。オープンソースのありがたみって、やっぱりこういうところにあると思う。解決策は、もやもやが残るままだけど...おまけ:php-fpmはどのようにargv[0]を書き換えているか?php-fpmは見ての通りargv[0]を書き換えるのだけど、argvを全部足しても期待の文字数に足りないなんてこともあるはず。そんなときの処理がfpm_env.cに書かれていた。言うと「environがargvとメモリ空間上に連続で置いてあるから、一応確認しつつenvironにどいてもらって、そこをargv[0]として使いましょう」である。グロい!コメントによると、nginxやpureftpdもそうしているらしい。この記事も最後なので該当コードを貼り付けておく。