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

42
在Linux上,可以使用 ulimit -n 更改或查看进程文件描述符数量的限制,并且 lsof -p nnn | wc -l 似乎始终报告实际文件描述符使用情况。
但是在macOS上, lsof -p nnn | wc -l 可能会返回高于限制的数字。我猜这意味着 lsof 返回了不止文件描述符,但我无法分辨哪些是文件描述符。
最重要的是:如何在macOS上获得准确的文件描述符使用计数?

1
首先,不要将输出导向管道并查看它实际列出的内容。然后你就会知道那些额外的描述符来自哪里以及它们是什么。 - Jason Coco
4个回答

50

最近我遇到了这个需求——我使用的命令用于计算总条目数(不仅仅是文件句柄,但相对而言很相关,因此在我看来很重要),命令如下:

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

这会生成类似以下输出(您使用最多的应用程序可能不同!):

$lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head
1259 Google
 682 Code\x20H
 369 Spotify
 334 VLC
 322 cloudd
 303 corespotl
 278 com.apple
 273 UserEvent
 249 GitHub
 176 Slack\x20

通常我只需要看到前10个条目,但你可以使用 head 命令来显示任意行数(例如:head -n 40)。


7
在调用uniq之前,应该先使用sort命令以避免重复条目:lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head - anthonybell
1
使用 lsof -n 命令,它不会尝试将 IP 地址解析为域名,因此速度更快。 - deadbeef
@deadbeef 我尝试了lsoflsof -n两种方式,但在我的情况下它们都需要15秒钟。 - Joshua Pinter

11

lsof能展示除文件描述符以外的很多东西,但你大部分可能看到的是应用程序已加载的框架和库。你可以查看“FD”列来确定一行是否是文件描述符--在这种情况下它会是一个数字,可能后面还会跟一个字母表示模式--或者其他内容(请参阅lsof手册中FD列的描述以获取完整列表)。

如果你只需要一个粗略的近似值,在wc前加上“grep -v“ txt ””将让你更接近一个准确的值。如果你需要一个精确的值,你可能需要编写一个正则表达式,通过FD列精确地过滤输出。


3
使用"lsof -d "^txt""可以避免使用grep命令。 - Jan S.

5

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

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

例子:

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

如果有人在意的话,计数会偏差一个,因为lsof -p $1除了文件描述符列表之外还会打印标题行。 - Aaron

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

lsof: illegal process ID: PID - bithavoc
1
@bithavoc,使用以下命令: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-- 这将剪切掉 ps 输出的第一行,该行包含列标题。 - VladLosev
你还应该在 lsof -p $pid | grep -v " txt " | wc -l 中添加 | tail -n +2 技巧,以避免将标题行计算为文件描述符。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接