3

Переходя к 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 '{print $2}'

1 ответ1

4

Вместо этого используйте pgrep :

pgrep -g 18322

От 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.

Кроме того, вы можете просто проанализировать вывод ps более простыми способами:

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

Или просто упростите свой (излишне сложный) оригинальный подход Perl:

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

Или просто grep:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .