如何在杀死php脚本时杀死passthru进程?

时间:2013-07-24 17:04:15

标签: php linux kill passthru

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

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

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

1 个答案:

答案 0 :(得分:3)

函数passthru()生成一个shell来运行命令,然后阻塞直到passthru进程返回。这些是具有不同进程ID的独立进程,而不是运行脚本的php解释器。你可以杀死脚本,但不会杀死它开始的进程。

但是,生成的进程具有相同的进程组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

您将终止所有三个流程。