Как получить список идентификаторов процессов, которые находятся в данной группе идентификаторов

4242
quuxman

Переходя к man-странице, я ожидал, что это сработает:

ps ah -o pid,pgrp -G 18322 

Но это показывает тот же список, что и без аргументов -G. Я хочу более разумный способ произвести этот вывод:

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

(Спасибо mst на #perl за perl-fu)

Вот более традиционная версия командной строки, (спасибо еще раз MST), но все же немного неловко. $ process_group должен быть установлен заранее:

ps ah -o pgrp,pid | egrep '^'$process_group' ' | awk '' 
2

1 ответ на вопрос

3
terdon

Use pgrep instead:

pgrep -g 18322 

From 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. 

Alternatively, you can just parse the ps output in simpler ways:

ps xh -o pgrp,pid | awk '$1==18322' 

Or just simplify your (needlessly complex) original Perl approach:

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

Or just grep:

ps xh -o pgrp,pid | grep -Po '\s*5592\s*\K.+' 

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