我有文件,其中每一行都是某个进程的pid。我想要实现的是显示文件描述符摘要。
所以基本上我的步骤是这样的:
ps -aux | grep -E 'riak|erlang' | tr -s " " | cut -f2 -d " " | xargs lsof -a -p $param | (wc -l per process)
我在这里迷路了:$param
我不知道如何从 stdin 中放置它,我也不知道如何使 wc -l 按每个lsof -a -p
结果分组,而不是总结果 - 我期待每个进程打开的文件数量,而不是全部。
奖励问题:如何转换此类输入:
123 foo-exe
234 bar-exe
(第一列 pid,第二个名称)结果像
123 foo-exe 1234
234 foo-exe 12344
其中第一列是 PID,第二列是名称,第三列是打开的文件数。我知道这可能是不同的方法(我想知道),但知道如何使用 bash 工具做到这一点会很好:)
假设 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 %10dn", pid, cmd[pid], count[pid];}}'