Невозможно убить группу процессов при вызове PHP

Это все файлы с нулевым байтом. 1 и null почти наверняка безопасно удалить. Если вы действительно параноик, вы можете переместить их, а не удалять.

2
17.03.2017, 12:14
1 ответ

Команда kill, когда получает PID, который < -1, рассматривает его как идентификатор группы процессов (PGID), а не как идентификатор процесса. Это документировано в 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, ни один из которых не является идентификатором группы процессов. 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 группы.

2
27.01.2020, 22:10

Теги

Похожие вопросы