Linuxでは、ulimit -n
を使用して、プロセスのファイル記述子の数の制限を変更または表示できます。lsof -p nnn | wc -l
は、実際のファイル記述子の使用状況を一貫して報告しているようです。
しかし、Mac OS Xでは、lsof -p nnn | wc -l
は制限よりも大きい数を返すことができます。これは、lsof
がファイル記述子以上のものを返していることを意味していると思いますが、何が何であるかわかりません。
結論:Mac OS Xでファイル記述子の使用状況を正確にカウントするにはどうすればよいですか?
lsofは、ファイル記述子以外にも多くのことを表示できますが、カウントを膨らませる可能性のあるもののほとんどは、アプリケーション用にロードされたフレームワークとライブラリです。 「FD」列を見て、行がファイル記述子であるかどうか(この場合は数字であり、モードを示す文字が後に続く可能性があります)または他の何かであるかどうかを確認できます(のFD列の説明を参照してください)。完全なリストについては、lsofのmanページ)。
大まかな概算が必要な場合は、wcの前に 'grep -v "txt"'を追加すると、正確な値にかなり近づくことができます。正確な値が必要な場合は、正規表現をまとめて、FD列によってそのファイラーを介して出力を正確にフィードする必要があります。
最近、これを特定する必要があることに気付きました。エントリの総数をカウントするために使用したコマンド(ファイルハンドルだけでなく、相対的なものであるため、関連する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
を操作して、必要な数の行を表示できます。
Andersの回答を変更しましたが、特定のプロセスの開いているfd番号のみが表示されるようになりました。
FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3
例:
$ ./fd-count.sh 5926
PID: 5926 97
ファイル記述子がたくさんあるプロセスを探していたので、次のようなものだと思います
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