phpで

exec("/usr/local/bin/hoge");
としたときに、hogeの実行が終わったのにexec()がそれを回収せず
hogeがゾンビ化したままで exec()も終了しない という現象が発生しました。

原因は不明なのですが、「こういう条件なら発生しうるよ!」という情報を募集します。

環境は
-phpはバージョン4.2.2のコマンドライン版
-OSはLinuxの2.4.20
-hogeはCプログラム
ですが、細かい情報は後出しします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2008/04/26 21:18:34
  • 終了:2008/05/03 14:16:20

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/04/26 22:00:39

ポイント35pt

考えられることとしては、hoge が正常終了していない――たとえば void main にして戻り値を指定していない、とか。


参考サイト

id:iww

ありがとうございます。

一応、戻り値は返していますが、もし万が一変な値が帰ったときに

再現するかどうか実験してみます。

2008/04/28 03:55:10
id:ken33jp No.2

ken33jp回答回数928ベストアンサー獲得回数132008/04/27 01:06:03

ポイント10pt

exec以外の方法を試してみてください。

http://hain.jp/index.php/tech-j/2006/08/30/p58

id:iww

今は原因をつきとめたいのが先なので作業はあとまわしになりますが

ゆくゆくはそうする必要があるかもしれません。

2008/04/28 03:56:44
id:pyopyopyo No.3

pyopyopyo回答回数337ベストアンサー獲得回数792008/04/27 14:39:49

ポイント35pt

hoge がゾンビ化しているということですので、「hogeの実行がまだ終わっていない」と考えたほうが良いと思います。

以下のようにして、hoge が出力するメッセージを /tmp/log に保存したり

 exec('/usr/local/bin/hoge > /tmp/log 2>&1');

hoge が実行するシステムコールを確認するために

 exec('strace -o /tmp/log /usr/local/bin/hoge');

として、 ログファイルを解析することで hoge の挙動を確認すると原因がわかるかもしれません。

 system('/usr/local/bin/hoge');

も試してみると良いと思います。

あと、以下のページの下部にある exec() に関する tips を見てみましたが iww さんの症状に該当するものは見当たりませんでした。

http://jp.php.net/function.exec

id:iww

psで確認したところ、完全にゾンビ<defunct> になっていましたので

プロセスとしては終了したものと思っていました。


おそらく、PHPのexec関数が内部で 子プロセスの終了シグナルを取りこぼした?

のだと思いますが古いPHPなのでバグの可能性もあるかと考えています。

実際、もっと古いバージョンではそういうバグもあったようです。

もし4.2以降でそういうバグ修正があったなら この問題もそのせいにして終わりなのですが

調べ方が悪いのか まだ見つけることが出来てません。

2008/04/28 04:09:06

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません