Wie bekomme ich eine Liste von Prozess-IDs, die sich in einer bestimmten Gruppen-ID befinden?

4294
quuxman

Bei der Manpage würde ich erwarten, dass dies funktioniert:

ps ah -o pid,pgrp -G 18322 

Dies zeigt jedoch genau die gleiche Liste wie ohne die Argumente -G. Ich möchte einen besseren Weg, um diese Ausgabe zu produzieren:

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

(Danke an mst auf #perl für den perl-fu)

Hier ist eine traditionellere Befehlszeilenversion (danke nochmal an mst), aber immer noch etwas umständlich. $ process_group muss vorher festgelegt werden:

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

1 Antwort auf die Frage

3
terdon

Verwenden Sie pgrepstattdessen:

pgrep -g 18322 

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

Alternativ können Sie die psAusgabe auf einfachere Weise parsen :

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

Oder vereinfachen Sie einfach Ihren (unnötig komplexen) ursprünglichen Perl-Ansatz:

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

Oder einfach nur grep:

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