根据手册页,我希望它能起作用:
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 上的 mst 提供的 perl-fu)
这是一个更传统的命令行版本(再次感谢 mst),但仍然有点尴尬。$process_group 需要预先设置:
ps ah -o pgrp,pid | egrep '^'$process_group' ' | awk '{print $2}'
答案1
改用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.+'