计算每个进程打开的文件

新手上路,请多包涵

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

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

如何获取 Linux 中每个进程的打开文件数?

原文由 Aladdin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 542
2 个回答

查看 /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

作为单线(通过附加 | grep -v "0 FDs" 过滤):

 for pid in /proc/[0-9]*; do printf "PID %6d has %4d FDs\n" $(basename $pid) $(ls $pid/fd | wc -l); done

作为包含命令名称的单行代码,按文件描述符计数降序排序(通过附加 | head -10 来限制结果):

 for pid in /proc/[0-9]*; do p=$(basename $pid); printf "%4d FDs for PID %6d; command=%s\n" $(ls $pid/fd | wc -l) $p "$(ps -p $p -o comm=)"; done | sort -nr

归功于 @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 /proc -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

原文由 Alfe 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试这个:

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

原文由 Cokorda Raka 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题