Por que não há uma maneira fácil de listar todos os processos em um determinado grupo de processos?

5

Claramente, para suportar kill (0) eficientemente, o kernel deve manter o controle dos processos em um grupo de processos. Mas essa informação não é exposta de forma alguma ao espaço do usuário. Para obter essa informação, seria necessário fazer uma iteração em toda a árvore procfs e verificar o pgid.

Isto é verdade para Linux, * BSD, etc. Todos os sistemas * nix que eu verifiquei têm esse problema. Por que eles são projetados dessa maneira?

EDIT : Altere a questão para que o exemplo de kill (0) faça sentido.

    
por yshui 06.05.2017 / 02:00

3 respostas

6

Você pode listar todos os processos em um determinado grupo, filtrando a saída de ps .

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

Não há ps opção para filtrar diretamente pelo PGID, provavelmente porque não é útil com muita frequência.

O que o ps faz sob o capô não importa realmente.

Isso não é atômico, diferente de kill -- -1234 . Mas mesmo que houvesse uma maneira de listar processos em um grupo de processos, o que seria bom? No momento em que você processa a lista, ela pode estar incompleta ou incluir processos que estão inativos e cujo PID foi reutilizado.

Para fazer qualquer coisa útil com o conjunto de processos em um grupo de processos, o kernel teria que expor uma interface que executa a ação, não apenas uma interface que lista os membros do grupo. A única interface é enviar um sinal para os processos.

    
por 07.05.2017 / 01:22
3

Ao enviar um sinal para o PID 0 (zero), o sinal é entregue a todos os processos que são membros do mesmo grupo de processos do remetente. Um grupo de processos diferente do atual pode ser sinalizado com kill(-PGID) (ou kill -- -PGID no shell), onde PGID é o ID do grupo de processos.

O grupo de processos de um PID é retornado pela função getpgid() , e o grupo de processos do processo atual pode ser encontrado com getpgrp() .

No shell, você pode usar

$ ps -opid,pgid,command

para obter o PID, o PGID (ID do grupo de processos) e a linha de comando da sua sessão atual.

Isso pode retornar algo como

  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

Após um esclarecimento da pergunta:

O propósito de um grupo de processos é poder enviar um sinal para todos os seus membros sem conhecer os IDs de cada membro individual.

Sem um conceito de grupo de processos, seria necessário obter todos os processos no sistema, descobrir como eles estão relacionados (usando os IDs de processo pai) e iterar sobre os processos relevantes, enviando cada um o sinal.

O kernel faz isso, mas conhece e acompanha os grupos de processos, portanto, ele nunca terá que iterar sobre todos os processos para enviar um sinal para um grupo de processos, somente sobre os membros do grupo. grupo.

Como o ID do grupo de processos é exposto ao usuário, basta consultar o um processo para seu ID de grupo de processos antes de poder enviar um sinal para todos processos nesse grupo.

    
por 06.05.2017 / 08:58
2

Na linha de comando do Linux, pode-se usar pgrep de procps-ng com o sinalizador --pgroup (ou -g ).

    
por 15.02.2018 / 19:09