2013-07-24 211 views
2

我通过PHP中继()运行Linux命令,例如:如何在杀死一个php脚本时杀死passthru进程?

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

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

回答

3

函数passthru()衍生出一个shell来运行您的命令,然后阻塞,直到passthru进程返回。这些独立进程的进程ID不同于运行脚本的php解释器。您可以杀死脚本,但不会终止它启动的进程。

但是产生的进程具有相同的进程组ID(PGID),您可以使用它来杀死它们或向它们发送任何其他信号。在我们的例子中,PGID将与PHP脚本的进程ID(PID)相同。

要查看呼叫群组身分,你可以执行命令: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 

并且您将终止所有三个进程。

+0

谢谢您的明确描述。 – Devon