プロセスごとに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

関連情報