我有一个产生两个僵尸的脚本.我可以通过kill – – < parent-pid>来杀死该组,但是当由PHP解释器调用时,虽然手动杀死每个进程,但这将无效.
脚本是
#!/bin/bash
sleep 1d&
sleep 1d
<?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 举报,一经查实,本站将立刻删除。