微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP调用时无法终止进程组

我有一个产生两个僵尸的脚本.我可以通过kill – – < parent-pid>来杀死该组,但是当由PHP解释器调用时,虽然手动杀死每个进程,但这将无效.

脚本是

#!/bin/bash
sleep 1d&
sleep 1d

并且PHP文件只是调用它:

<?PHP
exec("./spawn")
?>

从shell直接:

$./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

有什么想法吗?

解决方法:

当给定PID <1时,kill命令. -1,将其视为进程组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.但是,您尝试使用ID 19937和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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐