2017-05-10 7 views
0

LinuxでシンプルなCデーモンを作成しました。デーモンはSIGTERMシグナルを捕捉し、クリーンアップを行い、終了するように設定されています。コマンドラインから実行すると、期待どおりに動作します。 killコマンドでSIGTERMをデーモンに送信すると、正しく処理されます。PHPの特定の状況でCデーモンを停止できません

しかし、PHPアプリケーションからデーモンを起動して停止することができます。私はこれをPHPでexec()を使って行います。

exec("$daemon_name"); 

を開始するには、この方法が常に働くデーモンの起動

exec("kill $daemon_pid"); 

を停止するが、停止はしていません。実際、この方法で起動すると、コマンドラインからのkillの実行も機能しません。 "kill -9"だけが動作するようになりました。これは明らかに必要なクリーンアップを行いません。私が知る限り、プロセスは単に信号を受け取っていないだけです。

ここは本当に私を得ています。この全く同じ設定をSLES 12やOpenSuSE 42.2にデプロイすると動作しませんが、OpenSuSE 42.1では動作します(PHPで起動して停止できます)。

権限の問題ではありません。これを確認しました。

私は、プロセスがSIGTERM信号を受信できない原因について考えていません。 "ps aux"と "ps -ef"の出力を見ると、コマンドラインから起動したデーモンとPHP経由で起動したデーモンの違いはわかりません。

編集: これまでのコメントありがとうございます。まったく同じコードがいくつかのシステムでは動作するが、他のシステムでは動作しないことを考慮していないようだ。私が考えることができる唯一のことは、デーモンが異なる環境で開始されていることです。質問:環境内にプロセスが開始され、シグナルを無視することができる環境はありますか?

+0

私は2つのケースの間のブロックマスクの違いについて問題を追跡しました。私は質問[ここ](http://stackoverflow.com/questions/43931229/setting-up-signal-masks-in-a-linux-c-daemon)のための新しいスレッドを作成しました – Marius

+0

この問題は今解決されました。上記のコメントのリンクを参照してください。 – Marius

答えて

0

多分あなたの質問はなぜkill <pid>が機能しない可能性があります。それはPHPで特定の問題ではありません。 killはプロセスによって簡単に無視できます。今はCデーモンだと言いますが、デーモンが何をしているかは言及していません。だから私はあなたのデーモンがI/Oを待っていると仮定し、タイムアウトで正しく設定されておらず、あなたがそれを殺すと仮定します。そうすれば、プロセスは何に関係なく殺されることはありません。

可能な解決方法はhttps://askubuntu.com/questions/59811/kill-pid-not-really-killing-the-process-whyです。

+0

あなたは ''を必要としない 'pkill process'でも試してみることができます。代わりにプロセスの名前を使用します –

+0

最初の文の文は正しいですが、デーモンの起動時にkillはなぜ機能しますか?コマンドラインですが、別の方法で起動されている場合は表示されません。私は提供されたスレッドのいずれかの手がかりを見つけることができませんでした。 – Marius

+0

@マリアス私はここで仮定していますが、あなたが殺そうとしているプロセスが親プロセスであれば、 '-P'引数を使うことができます。このように 'pkill -P ' –

関連する問題