web-dev-qa-db-ja.com

Unix上のすべてのプロセスについて、プロセスごとに開いているファイル記述子の数をリストする方法は?

すべてのプロセスと、そのプロセスに対して開いているファイル記述子の数を一覧表示して、開いているファイルの数が多すぎるプロセスを特定できるようにする必要があります。いいえ、他の質問のように1つのプロセスだけで開いているファイルの数は必要ありません。実行中のすべてのプロセスの数を知る必要があります。降順で並べ替えることをお勧めします。

lsofはこれができるようには見えません。これを達成できる他のユーティリティまたは何かがありますか?

4
A. Nguyen

私は次のようなことをします:

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]/に置き換えます。ファイル記述子

4

これは、少なくともSolarisおよびLinuxで、おそらく/procファイルシステムをサポートする他のほとんどのOSで動作します。

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

Linuxまたは他のOSでは、GNU sortを使用して、-rgではなく-rnを使用してください。

2
jlliagre