嵌入式开发交流网论坛
标题:
一天一个Linux命令(1)「lsof」
[打印本页]
作者:
丁r
时间:
2020-12-12 13:52
标题:
一天一个Linux命令(1)「lsof」
很久(一年多了)没有写文章了。工作越来越忙了,有时候也因为懒,有时候呢又会想太多,觉得自己写得不好,写的这些东西有什么用啊,网上可能很多,而且甚至我还会有些是写错的呢。之前写的也有很多,是为了获得阅读量,从而使用阿里腾讯之类的,马云马化腾之类的热点信息。现在,我就打算就至少每天,发出来一篇自己之前做的笔记,这样也可以勉励自己不断的往自己笔记池子里进行补充内容。也可以达到分享和和有心的读者讨论的目的。
之前一直用lsof也只是做做lsof -i:port端口号,来看看信息,还有lsof -i|grep pid来查看。
实际上它还有很多功能。
-a 列出打开文件存在的进程
-c 列出指定进程所打开的文件
-g 列出GID号进程详情
-d 列出占用该文件号的进程
+d 列出目录下被打开的文件
+D 递归列出目录下被打开的文件
-n 列出使用NFS的文件
-i 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
#进程查端口lsof -i | grep pid#端口查进程lsof -i:port#使用lsof查看进程句柄使用情况lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more#但这个查的我理解的,并不是当前未关闭的句柄数COMMAND:进程的名称 PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
#查看所有进程的文件打开数lsof |wc -l#查看整个系统目前使用的文件句柄数cat /proc/sys/fs/file-nr#查看某个进程的的文件句柄数lsof -p pid|wc -l查看某个目录,文件被什么进程占用lsof path(file)
使用脚本采集每10秒某程序的句柄使用情况
#!/bin/sh set -x echo "">total_handler psid=`ps -ef|grep $1|head -1|awk '{print $2}'` count=0 while do lsof -p $psid|wc -l >> total_handler sleep 10 count=`expr $count + 1` donelsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more但我发现,这个结果看到的句柄数,有时候是一个过大的值。之所以说有时候,是我在Mac上的时候,发现这个值找到的pid打开的句柄,和这里的确实数量一致或者相差不大。
[attach]55642[/attach]mac截图
但是在centos7上,看到lsof -p pid得到行数值,是远远小于统计值,而且大多数的进程,都有这个统计特点。
[attach]55643[/attach]centos7截图
所以我还是没有搞大明白,为何两者之间会有这么大的差距呢?
首先lsof -p pid是可以看到具体的打开着的文件句柄。所以他的统计数,应该是未关闭的句柄。而统计的那个语句,是因为本身命令读取的,就是另外一个值(比如进程历史总打开句柄数),还是怎样,还没搞清楚。而我们运维有次根据这个图里的长命令,表示是程序写的有问题,导致耗尽了文件句柄,但实际我没有看到too many open files给出。而且还发现,一台机器上的nacos,用
查看到更是统计出27万多的数,显然这个数,不是表示这个进程正打开未关闭的文件句柄数(通过lsof |wc -l 查看到的总数,和这里分进程排序查看后相加的总数是一样的)。通过查看系统限制,也会发现此时的配置是低于这个值的。
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/)
Powered by Discuz! X3.2