在Mac OS X中,如何获得文件描述符使用的准确计数?

时间:2009-04-27 20:48:08

标签: macos unix lsof

在Linux上,ulimit -n可用于更改或查看进程文件描述符数量的限制,lsof -p nnn | wc -l似乎始终报告实际文件描述符的使用情况。

但在Mac OS X上,lsof -p nnn | wc -l可以返回高于限制的数字。我想这意味着lsof返回的不仅仅是文件描述符,但我不知道它是什么。

结论:如何在Mac OS X中准确计算文件描述符的使用情况?

4 个答案:

答案 0 :(得分:39)

我最近发现需要识别这个 - 我用来计算总条目的命令(因此不仅仅是文件句柄,但它的相对因此因此相关的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以显示任意数量的行。

答案 1 :(得分:10)

lsof除了文件描述符之外还可以显示很多东西,但是大多数可能会使计数膨胀的是应用程序的加载框架和库。您可以查看“FD”列以查看某行是否是文件描述符 - 在这种情况下,它是一个数字,可能后跟一个表示该模式的字母 - 或者其他内容(请参阅中的FD列的说明) lsof手册页的完整列表)。

如果您只是需要粗略的近似,在您的wc之前添加'grep -v“txt”'将使您更接近准确的值。如果您需要精确值,则可能需要将正则表达式放在一起,以便通过FD列精确地通过该文件管理器提供输出。

答案 2 :(得分:3)

我一直在寻找哪个进程有很多文件描述符 - 所以我想像是

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 :(得分:3)

我修改了anders的答案,现在它只显示特定进程的已打开的fd编号:

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

示例:

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