人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: いわわ
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:hoge Linux OS PHP コマンドライン
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●35ポイント

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


参考サイト

◎質問者からの返答

ありがとうございます。

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

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


2 ● ken33jp
●10ポイント

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

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

◎質問者からの返答

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

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


3 ● pyopyopyo
●35ポイント

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

◎質問者からの返答

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

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


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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ