在Linux上,ulimit -n
可用于更改或查看进程文件描述符数量的限制,lsof -p nnn | wc -l
似乎始终报告实际文件描述符的使用情况。
但在Mac OS X上,lsof -p nnn | wc -l
可以返回高于限制的数字。我想这意味着lsof
返回的不仅仅是文件描述符,但我不知道它是什么。
结论:如何在Mac OS X中准确计算文件描述符的使用情况?
答案 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