web-dev-qa-db-ja.com

Mac OS Xで、ファイル記述子の使用状況を正確にカウントするにはどうすればよいですか?

Linuxでは、ulimit -nを使用して、プロセスのファイル記述子の数の制限を変更または表示できます。lsof -p nnn | wc -lは、実際のファイル記述子の使用状況を一貫して報告しているようです。

しかし、Mac OS Xでは、lsof -p nnn | wc -lは制限よりも大きい数を返すことができます。これは、lsofがファイル記述子以上のものを返していることを意味していると思いますが、何が何であるかわかりません。

結論:Mac OS Xでファイル記述子の使用状況を正確にカウントするにはどうすればよいですか?

35
jfklein

lsofは、ファイル記述子以外にも多くのことを表示できますが、カウントを膨らませる可能性のあるもののほとんどは、アプリケーション用にロードされたフレームワークとライブラリです。 「FD」列を見て、行がファイル記述子であるかどうか(この場合は数字であり、モードを示す文字が後に続く可能性があります)または他の何かであるかどうかを確認できます(のFD列の説明を参照してください)。完全なリストについては、lsofのmanページ)。

大まかな概算が必要な場合は、wcの前に 'grep -v "txt"'を追加すると、正確な値にかなり近づくことができます。正確な値が必要な場合は、正規表現をまとめて、FD列によってそのファイラーを介して出力を正確にフィードする必要があります。

10
smorgan

最近、これを特定する必要があることに気付きました。エントリの総数をカウントするために使用したコマンド(ファイルハンドルだけでなく、相対的なものであるため、関連するimo)は次のとおりです。

lsof | awk '{print $1}' | uniq -c | sort -rn | head

これにより、次のような出力が得られます(最もよく使用されるアプリケーションは異なる場合があります!)。

$lsof | awk '{print $1}' | uniq -c | sort -rn | head
3271 com.Apple
2978 Google
 914 Atom\x20H
 505 Skype
 476 Microsoft
 375 Screenher
 304 Finder
 292 Dock
 277 Atom\x20H
 270 Atom\x20H

通常、上位10エントリのみを表示する必要がありますが、headを操作して、必要な数の行を表示できます。

44
PhillipHolmes

Andersの回答を変更しましたが、特定のプロセスの開いているfd番号のみが表示されるようになりました。

FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3

例:

$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97
4
laike9m

ファイル記述子がたくさんあるプロセスを探していたので、次のようなものだと思います

for pid in `ps aux | tail -n +2 | awk '{print $2}'`; do FCOUNT=`lsof -p $pid | grep -v " txt " | wc -l`; echo "PID: $pid $FCOUNT"; done | sort -nk3
3
anders.norgaard