2013-07-24 115 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