PHP 호출 시 프로세스 그룹을 종료할 수 없습니다.

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

이것에 대한 생각이 있나요?

답변1

kill주어진 PID가 -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. 그러나 실제로 1993719936프로세스 그룹 ID가 아닌 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이므로 해당 그룹의 모든 항목을 종료하려면 이를 사용해야 합니다.

셸에서 직접 명령을 실행하는 경우 최상위 상위 프로세스는 셸 스크립트의 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

하지만 이는 쉘 스크립트의 PID가 그룹의 PGID이기 때문입니다.

관련 정보