如何按进程列出 Unix 上所有进程的打开文件描述符数量?

如何按进程列出 Unix 上所有进程的打开文件描述符数量?

我需要列出每个进程以及该进程打开的文件描述符数量,以便我可以确定哪些进程保留了太多打开的文件。不,我不需要像其他问题所询问的那样只需要一个进程的打开文件数。我需要知道每个正在运行的进程的编号,最好按降序排列。

lsof 似乎不能做到这一点。有没有其他实用程序或东西可以完成此任务?

答案1

我会做类似的事情:

sudo lsof -FKc |
  awk '
   function process() {
     if (pid || tid) {
       print n, \
             tid ? tid " (thread of " pid ": " pname")" : pid, \
             name
       n = tid = 0
     }
   }
   {value = substr($0, 2)}
   /^p/ {
     process()
     pid = value
     next
   }
   /^K/ {
     tid = value
     next
   }
   /^c/ {
      name = value
      if (!tid)
        pname = value
      next
   }
   /^f/ {n++}
   END {process()}' | sort -rn

对于开放数量文件,并替换/^f//^f[0-9]/打开的数量文件描述符

答案2

这至少适用于 Solaris 和 Linux,并且可能适用于大多数支持/proc文件系统的其他操作系统:

#!/bin/sh
cd /proc
echo "  count  pid"
ls -d [1-9]*/fd/* 2>/dev/null | sed 's/\/fd.*$//' | uniq -c | sort -rn

在 Linux 或其他操作系统下使用GNU-rg代替。-rnsort

相关内容