Process

由 PHP 呼叫時無法終止程序組

  • October 8, 2020

我有一個產生兩個殭屍的腳本。我可以通過 殺死該組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 &lt; -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。

引用自:https://unix.stackexchange.com/questions/352053