如何在杀死php脚本时杀死passthrough进程



我正在通过PHP passthru()运行一个linux命令,例如:

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

现在说我想杀了剧本。我会杀死script.pid中列出的进程;然而,这使得sleep 500(或任何进程)在后台运行。虽然我使用passthru()作为exit返回变量,但我从system()和shell_exec()中得到了相同的结果。有人知道解决方案,甚至知道为什么这会让流程在后台运行的原因吗?

函数passthru()生成一个shell来运行您的命令,然后阻塞,直到passthrough进程返回。这些是独立的进程,与运行脚本的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

您将终止所有三个进程。

相关内容

  • 没有找到相关文章

最新更新