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経由で起動したデーモンの違いはわかりません。
編集: これまでのコメントありがとうございます。まったく同じコードがいくつかのシステムでは動作するが、他のシステムでは動作しないことを考慮していないようだ。私が考えることができる唯一のことは、デーモンが異なる環境で開始されていることです。質問:環境内にプロセスが開始され、シグナルを無視することができる環境はありますか?
私は2つのケースの間のブロックマスクの違いについて問題を追跡しました。私は質問[ここ](http://stackoverflow.com/questions/43931229/setting-up-signal-masks-in-a-linux-c-daemon)のための新しいスレッドを作成しました – Marius
この問題は今解決されました。上記のコメントのリンクを参照してください。 – Marius