Почему нет простого способа перечислить все процессы в данной группе процессов?

install libpt-dev

export PTLIB_CONFIG=/usr/share/ptlib/make/ptlib-config

./configure
8
06.05.2017, 13:02
3 ответа

Вы можете перечислить все процессы в данной группе, отфильтровав вывод ps.

ps -e -o pgid,pid | awk -v p=1234 '$1 == p {print $2}'

Нет возможности ps для прямой фильтрации по PGID, вероятно, потому, что это не очень часто бывает полезно.

То, что ps делает под капотом, не имеет большого значения.

Это не атомарно, в отличие от kill -- -1234. Но даже если бы существовал способ атомарного перечисления процессов в группе процессов, что хорошего в этом было бы? К моменту обработки списка он может быть неполным или включать мертвые процессы, PID которых был повторно использован.

Чтобы сделать что-то полезное с набором процессов в группе процессов, ядру пришлось бы предоставить интерфейс, который выполняет действие, а не только интерфейс, в котором перечислены члены группы. Единственный такой интерфейс — посылать сигнал процессам.

6
27.01.2020, 20:09

При отправке сигнала на PID 0 (ноль) сигнал доставляется всем процессам, которые являются членами той же группы процессов, что и отправитель. Группа процессов, отличная от текущей, может быть обозначена с помощью kill(-PGID) (или kill -- -PGID в оболочке), где PGID — это идентификатор группы процессов.

Группа процессов PID возвращается функцией getpgid(), а группу процессов текущего процесса можно найти с помощью getpgrp().

В оболочке вы можете использовать

$ ps -opid,pgid,command

для получения PID, PGID (идентификатор группы процессов) и командной строки вашего текущего сеанса.

Это может вернуть что-то вроде

  PID  PGID COMMAND
20716 20716 -ksh93 (ksh93)
83662 83662 -ksh93 (ksh93)
 4322  4322 /usr/X11R6/bin/xclock
 5374  5374 tmux: client (/tmp/tmux-11000/default) (tmux)
78747 78747 -ksh93 (ksh93)
29298 29298 ps -opid
63563 63563 -ksh93 (ksh93)
63327 63327 mutt
21790 21790 -ksh93 (ksh93)
64493 64493 /bin/sh /usr/X11R6/bin/startx
14485 64493 xinit /home/kk/.xinitrc -- /usr/X11R6/bin/X :0 -auth /home/kk/.serverauth.E3cwuT5FZR
93531 93531 sh /home/kk/.xinitrc
48598 93531 flwm
28154 93531 xterm
73053 93531 xterm

После уточнения вопроса:

цель группы процессов состоит в том, чтобы иметь возможность посылать сигнал всем своим членам без, зная идентификаторы процессов каждого отдельного члена.

Без концепции группы процессов нужно было бы получить все процессы в системе, выяснить, как они связаны (используя идентификаторы родительских процессов) и выполнить итерацию по соответствующим процессам, посылая каждому сигнал.

Ядро делает это, но оно знает и отслеживает группы процессов, поэтому ему никогда не придется перебирать все процессы, чтобы послать сигнал группе процессов, только по членам группы .

Поскольку идентификатор группы процессов открывается для пользователя, достаточно будет запросить идентификатор группы процессов только у одного процесса, прежде чем можно будет отправить сигнал всем процессам в эта группа.

3
27.01.2020, 20:09

Desde la línea de comandos en Linux, se puede usar pgrepdesde procps -ng con el indicador--pgroup(o -g).

6
27.01.2020, 20:09

Теги

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