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

如果我把所有的文件按照它们的PID进行分组并计数,这需要相当长的时间.

How can I take the open files count for each process in Linux?

推荐答案

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

Linux相关问答推荐

我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号.

如何告诉链接器不要在链接的共享库中查找某些符号?

`__meminit` 在 Linux 内核中意味着什么?

用户级线程如何与内核级线程对话

从 Ansible 中的 shell 命令输出中提取特定数据

使用 Dockerfile RUN 执行某些操作但忽略错误

MessageBox 的 GTK 实现

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

查看 linux 上的多核或多 CPU 利用率

diff 命令仅获取不同行的数量

Vagrant chicken-and-egg:与 uid = apache 用户共享文件夹

在 Linux/POSIX 系统上获取用户全名的最简单方法是什么?

如何在 Bash 中对齐空格分隔表的列?

为什么可执行文件操作系统依赖于?

C++:使用 longjmp 和 setjmp 安全吗?

如何通过命令提示符判断 Linux 中的 BIOS 版本或名称?

Android - 找不到命令

在Linux中使用空格设置环境变量

如何在 sed 中指定非捕获组?

如何限制我网站的 API 用户?