我有文件,其中每一行都是某个进程的pid。我想要实现的是显示文件描述符摘要。
基本上我的步骤是这样的:
ps -aux | grep -E 'riak|erlang' | tr -s " " | cut -f2 -d " " | xargs lsof -a -p $param | (wc -l per process)
我迷失在这里:$param
我不知道如何将它从stdin中删除,我也不知道如何根据每个lsof -a -p
结果对wc -l进行分组,而不是总结果 - 我期望每个进程打开文件的数量,而不是所有进程。
奖金问题:如何转换此类输入:
123 foo-exe
234 bar-exe
(第一栏pid,第二名) 结果像
123 foo-exe 1234
234 foo-exe 12344
其中第一列是pid,第二列是name,第三列是打开文件的数量。 我知道这可能是不同的做法(我想知道),但知识如何使用bash工具做到这一点会很好:)
答案 0 :(得分:2)
假设riak,erlang是用户名。
ps -e -o pid=,comm= -U riak,erlang | while read pid comm; do lsof=`lsof -a -p $param | wc -l`; echo $pid $comm $lsof; done
纯粹的基于lsof + awk的方法(应该比以前的方法更快)。
{ lsof -u riak +c 0; lsof -u erlang +c 0; } | awk '{cmd[$2]=$1;count[$2]++;}function cmp_num_idx(i1, v1, i2, v2) {return (i1 - i2);} END{PROCINFO["sorted_in"]="cmp_num_idx"; for (pid in cmd){ printf "%10d %20s %10d\n", pid, cmd[pid], count[pid];}}'