11

Web サイトの場合、デーモン プロセスを開始および停止できる必要があります。私が現在していることは、

exec("sudo /etc/init.d/daemonToStart start");

デーモン プロセスは開始されますが、Apache/PHP がハングします。実行するps auxと、それsudo自体がゾンビ プロセスに変更され、それ以降のすべての進行が効果的に停止されます。PHP からデーモンを起動しようとすると、これは正常な動作ですか?

はい、Apache にはコマンドを実行する権利があり/etc/init.d/daemonToStartます。/etc/sudoers ファイルを変更して、そうできるようにしました。いいえ、私は Apache があらゆる種類のコマンドを実行することを許可していません。Web サイトが機能するように、いくつかのコマンドを実行できるようにしています。

とにかく、私の質問に戻りますが、ゾンビプロセスが作成されないように PHP がデーモンを開始できるようにする方法はありますか? 逆に、すでに開始されているデーモンを停止すると、問題なく機能するため、これを尋ねます。

4

3 に答える 3

13

コマンドに追加> /dev/null 2>&1 &してみてください。

したがって、この:

exec("sudo /etc/init.d/daemonToStart > /dev/null 2>&1 &");

念のため、それが何をするのか/その理由を知りたい場合:

  • > /dev/null- STDOUT を /dev/null にリダイレクトします (つまり、ブラックホール化します)。
  • 2>&1- STDERR を STDOUT にリダイレクトします (これもブラックホール化します)。
  • &プロセスを切り離してバックグラウンドで実行する
于 2011-12-05T14:52:01.347 に答える
2

私も同じ問題を抱えていました。

私は DaveRandom に同意します。すべての出力 (stdout と stderr) を抑制する必要があります。しかし、末尾が ' ' の別のプロセスで起動する必要はあり&ません。

また、「ブラックホール」ではなく、出力を一時ファイルに保存することを好みます。作業ソリューション:

$temp = tempnam(sys_get_temp_dir(), 'php');
exec('sudo /etc/init.d/daemonToStart >'.$temp.' 2>&1');

後でファイルの内容を読み取り、一時ファイルを削除します。

$output = explode("\n", file_get_contents($temp));
@unlink($temp);
于 2014-06-12T12:34:21.753 に答える
0

PHP からデーモンを起動しようとしたことはありませんが、のシェル コマンドを実行しようとしましたが、多くの問題がありました。過去に私が試したいくつかのことを次に示します。

  • DaveRandom の回答に従って/dev/null 2>&1 &、コマンドの最後に追加します。これにより、エラーが標準出力にリダイレクトされます。その後、この出力を使用してデバッグできます。
  • Web サーバーのユーザーの PATH に、デーモン スクリプト内で参照されているすべてのバイナリが含まれていることを確認してください。これを行うには、 を呼び出しexec('echo $PATH; whoami;)ます。これにより、PHP が実行されているユーザーと、それが現在の PATH 変数であることがわかります。
于 2011-12-05T14:58:40.910 に答える