Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS X中,如何获得文件描述符使用的准确计数?_Macos_Unix_Lsof - Fatal编程技术网

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

Macos 在Mac OS X中,如何获得文件描述符使用的准确计数?,macos,unix,lsof,Macos,Unix,Lsof,在Linux上,ulimit-n可用于更改或查看进程的文件描述符数量限制,lsof-p nnn | wc-l似乎始终报告实际的文件描述符使用情况 但在Mac OS X上,lsof-p nnn | wc-l可以返回高于限制的数字。我想这意味着,lsof返回的不仅仅是文件描述符,但我不知道是什么 一句话:如何准确统计Mac OS X中文件描述符的使用情况?lsof可以显示文件描述符以外的许多内容,但最可能让您增加数量的是应用程序加载的框架和库。您可以查看“FD”列以查看一行是否是文件描述符——在这种

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

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


一句话:如何准确统计Mac OS X中文件描述符的使用情况?

lsof可以显示文件描述符以外的许多内容,但最可能让您增加数量的是应用程序加载的框架和库。您可以查看“FD”列以查看一行是否是文件描述符——在这种情况下,它是一个数字,可能后跟一个表示模式的字母——或者其他内容(完整列表请参见lsof手册页中FD列的描述)


如果你只需要一个粗略的近似值,在你的wc之前加上一个“grep-v“txt”将使你更接近一个精确的值。如果你需要一个精确的值,你可能需要把一个正则表达式放在一起,通过FD列精确地输入文件器的输出。

我在寻找哪个进程有很多文件描述符,所以我想

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

我最近遇到了识别这一点的需要——我用来计算总条目数的命令(不仅仅是文件句柄,而是它的相对值,因此与imo相关)是:

这将提供类似以下输出的内容(您使用最多的应用程序可能会有所不同!):


我通常只需要查看前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

首先,不要对输出进行管道化处理,看看它实际列出了什么。然后你就会知道这些额外的描述符来自何处以及它们是什么。
lsof:invally process ID:PID
@bithavoc,在
ps aux|tail-n+2|awk'{print$2}'中用于PID
;do FCOUNT=
lsof-p$pid | grep-v“txt”| wc-l
;回显“PID:$PID$FCOUNT”;完成| sort-nk3——这将切断包含列标题的ps输出的第一行。您还应该将
|tail-n+2
技巧添加到
lsof-p$pid | grep-v“txt”| wc-l
中,这样就不会将标题行作为文件描述符来计算。
lsof-d“^txt”
将避免使用grep。在调用
uniq
之前,您应该
sort
,以避免重复条目:
lsof | awk'{print$1}“| sort | uniq-c | sort-rn | head
使用
lsof-n
,它不尝试将IP解析为域名,而且速度更快。@deadbeef我尝试了
lsof
lsof-n
两种方法,对我来说都是15秒。如果这对任何人都重要,由于
lsof-p$1
将在文件描述符列表之外打印一个标题行,因此计数被关闭1。
FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3
$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97