计算每个进程的打开文件

时间:2014-02-13 10:51:34

标签: linux bash ps

我正在开发一个监视进程资源的应用程序,并在Linux中提供定期报告,但是我在提取每个进程的打开文件数方面遇到了问题。

如果我取出所有文件并根据它们的PID对它们进行分组并计算它们,这需要相当长的时间。

如何在Linux中为每个进程计算打开的文件数?

4 个答案:

答案 0 :(得分:50)

查看/proc/文件系统:

ls /proc/$pid/fd/ | wc -l

要对所有进程执行此操作,请使用:

cd /proc
for pid in [0-9]*
do
    echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors"
done

编辑:感谢@Boban获取此附录:您可以将上述脚本的输出通过管道传输到以下脚本中,以查看打开了最多文件描述符的十个进程(及其名称):

  ...
done | sort -rn -k5 | head | while read -r _ _ pid _ fdcount _
do
  command=$(ps -o cmd -p "$pid" -hc)
  printf "pid = %5d with %4d fds: %s\n" "$pid" "$fdcount" "$command"
done

这是另一种列出前十个进程的方法,这些进程具有最开放的fds,可能不太可读,所以我不把它放在前面:

find -maxdepth 1 -type d -name '[0-9]*' \
     -exec bash -c "ls {}/fd/ | wc -l | tr '\n' ' '" \; \
     -printf "fds (PID = %P), command: " \
     -exec bash -c "tr '\0' ' ' < {}/cmdline" \; \
     -exec echo \; | sort -rn | head

答案 1 :(得分:4)

试试这个:

ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}

答案 2 :(得分:2)

我用它来查找给定用户(用户名)的顶级文件处理程序消耗进程,其中没有lsof或root访问权限:

for pid in `ps -o pid -u username` ; do echo "$(ls /proc/$pid/fd/ 2>/dev/null | wc -l ) for PID: $pid" ; done  | sort -n | tail

答案 3 :(得分:0)

这对我有用:

ps -opid= -ax | xargs -L 1 -I{} -- sudo bash -c 'echo -n "{} ";lsof -p {} 2>/dev/null | wc -l' | sort -n -k2

它按numopenfiles分类的pid打印numopenfiles

它将要求一次sudo密码。

请注意,上述数字的总和可能大于所有进程中打开文件的总数。
正如我在这里阅读的:forked processes can share file handles