Process
由 PHP 呼叫時無法終止程序組
我有一個產生兩個殭屍的腳本。我可以通過 殺死該組
kill -- -<parent-pid>
,但是當被 PHP 解釋器呼叫時,儘管手動殺死每個程序都可以,但這不起作用。腳本是
#!/bin/bash sleep 1d& sleep 1d
PHP文件只是呼叫它:
<?php exec("./spawn") ?>
直接從外殼:
$ ./spawn& [1] 19871 $ pstree -p 19871 spawn(19871)─┬─sleep(19872) └─sleep(19873) $ kill -- -19871 $ pstree -p 19871 [1]+ Terminated ./spawn
…並通過 PHP:
$ php -f zomby.php & [1] 19935 $ pstree -p 19935 php(19935)───sh(19936)───spawn(19937)─┬─sleep(19938) └─sleep(19939) $ kill -- -19937 bash: kill: (-19937) - No matching process found $ kill -- -19936 bash: kill: (-19936) - No matching process found $ kill 19939 19938 19937 $ Terminated [1]+ Fertig php -f zomby.php
只有殺死 PHP 父程序才會起作用:
$ php -f zomby.php & [1] 20021 $ pstree -p 20021 php(20021)───sh(20022)───spawn(20023)─┬─sleep(20024) └─sleep(20025) $ kill -- -20021 $ pstree -p 20021 [1]+ Terminated php -f zomby.php
有什麼想法嗎?
該
kill
命令在給定一個 < -1 的 PID 時,將其視為程序組 ID (PGID),而不是程序 ID。這記錄在info kill
:‘PID < -1’ The process group whose identifier is −PID.
如果我們再次舉你的例子:
$ pstree -p 19935 php(19935)───sh(19936)───spawn(19937)─┬─sleep(19938) └─sleep(19939)
PGID 是程序樹的最頂層父程序的 PID,在本例中為
19935
。但是,您試圖殺死屬於具有 ID19937
和的程序組的程序19936
,它們實際上都不是程序組 ID。PGID 是19935
.您也許可以更清楚地看到這一點
ps
。如果我在我的系統上執行相同的命令:$ php -f ./zombie.php & [2] 12882 $ ps -o pid,ppid,pgid,command | grep -E '[P]GID|[1]2882' PID PPID PGID COMMAND 12882 1133 12882 php -f ./zombie.php 12883 12882 12882 /bin/bash ./spawn 12884 12883 12882 sleep 1d 12885 12883 12882 sleep 1d
在上面的範例中,組的 PGID 是
12882
,所以如果我想殺死組中的所有內容,這就是我需要使用的。當您直接從 shell 執行命令時,最頂層的父程序是 shell 腳本的 PID,因此您可以通過執行以下命令殺死其樹中的所有程序
kill -- -PID
:$ ./spawn & [3] 14213 terdon@tpad foo $ ps -o pid,ppid,pgid,command | grep -E '[P]GID|[1]4213' PID PPID PGID COMMAND 14213 1133 14213 /bin/bash ./spawn 14214 14213 14213 sleep 1d 14215 14213 14213 sleep 1d
但那是因為 shell 腳本的 PID 是組的 PGID。