Como obter lista de IDs de processo que estão em um determinado ID de grupo

2

Indo pela página man, eu esperaria que isso funcionasse:

ps ah -o pid,pgrp -G 18322

Mas isso mostra exatamente a mesma lista que os argumentos -G. Eu quero uma maneira mais sadia de produzir essa saída:

ps ah -o pid,pgrp | perl -e 'while(<STDIN>){ my @ws = split " ", $_; if ($ws[1] eq $ARGV[0]) { print $ws[0]."\n" } }' 18322

(Obrigado ao mst no #perl pelo perl-fu)

Aqui está uma versão de linha de comando mais tradicional (graças a mst), mas ainda um pouco estranha. $ process_group precisa ser definido antecipadamente:

ps ah -o pgrp,pid | egrep '^'$process_group' ' | awk '{print $2}'
    
por quuxman 05.06.2014 / 02:09

1 resposta

3

Use pgrep :

pgrep -g 18322

De man pgrep :

   -g, --pgroup pgrp,...
          Only  match  processes in the process group IDs listed.  Process
          group 0 is translated into pgrep's or pkill's own process group.

Como alternativa, você pode simplesmente analisar a ps output de maneiras mais simples:

ps xh -o pgrp,pid | awk '$1==18322{print $2}'

Ou simplesmente simplifique sua abordagem Perl original (desnecessariamente complexa):

ps xh -o pgrp,pid | perl -lane 'print $F[1] if $F[0] eq 5592'

Ou apenas grep :

ps xh -o pgrp,pid | grep -Po '\s*5592\s*\K.+'
    
por 05.06.2014 / 15:00