2

PHP passthru() を介して Linux コマンドを実行しています。例:

<?php
file_put_contents("script.pid", getmypid());
passthru("sleep 500", $exit);

ここで、スクリプトを強制終了したいとします。にリストされているプロセスを強制終了しscript.pidます。ただし、これにより、sleep 500(または任意のプロセス) がバックグラウンドで実行されたままになります。exit戻り変数に passthru() を使用していますが、system() と shell_exec() から同じ結果が得られます。これによりプロセスがバックグラウンドで実行される理由を知っている人はいますか?

4

1 に答える 1

3

関数passthru()はシェルを生成してコマンドを実行し、パススルー プロセスが戻るまでブロックします。これらは、スクリプトを実行する PHP インタープリターとは異なるプロセス ID を持つ独立したプロセスです。スクリプトを強制終了できますが、スクリプトが開始したプロセスを強制終了することはできません。

ただし、生成されたプロセスには同じプロセス グループ ID (PGID) があり、それを使用してプロセスを強制終了したり、他のシグナルを送信したりできます。この場合の PGID は、php スクリプトのプロセス ID (PID) と同じです。

PGID を表示するには、コマンド ps axjf を実行すると、次のような結果が得られます。

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
24077 12484 12484 24077 pts/9    12484 S+    1000   0:00  |   \_ php sleepScript.php
12484 12486 12484 24077 pts/9    12484 S+    1000   0:00  |       \_ sh -c sleep 500
12486 12487 12484 24077 pts/9    12484 S+    1000   0:00  |           \_ sleep 500

この例の PGID は 12484 (php スクリプトの PID と同じ) であり、そのグループに終了シグナルを送信するには、PGID の前にマイナス記号を付けて kill コマンドを使用します。

kill -15 -24077

これで、3 つのプロセスすべてが終了します。

于 2013-07-24T18:48:23.643 に答える