web-dev-qa-db-ja.com

特定のグループIDに含まれるプロセスIDのリストを取得する方法

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

(Perl-fuの#Perlのmstに感謝します)

これはより伝統的なコマンドラインバージョンです(mstに感謝します)が、それでも少し厄介です。 $ process_groupは事前に設定する必要があります。

ps ah -o pgrp,pid | egrep '^'$process_group' ' | awk '{print $2}'
3
quuxman

代わりに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.+'
4
terdon