38

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

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

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

4

4 回答 4

46

我最近遇到了识别这一点的需要——我用来计算总条目的命令(不仅仅是文件句柄,而是它的相对关系,因此与 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显示任意数量的行。

于 2015-02-13T17:45:10.057 回答
11

lsof 不仅可以显示文件描述符,还可以显示很多东西,但大多数可能会增加您的计数的是应用程序的已加载框架和库。您可以查看“FD”列以查看某行是否为文件描述符——在这种情况下,它是一个数字,可能后跟一个指示模式的字母——或其他内容(参见lsof 手册页的完整列表)。

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

于 2009-04-28T14:29:08.677 回答
5

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

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

例子:

$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97
于 2015-09-21T02:03:47.393 回答
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
于 2014-03-07T21:07:26.647 回答