对于某些耗资源的应用,诸如java和数据库之类的,打开文件(open file)数往往会超出Linux系统的默认限制,这时就需要调整系统内核的ulimit参数。但在应用的具体运行中,仍有可能出现打开文件数超出限制的情况,此时应用将会出现异常,所以我们在运维中应该对打开文件数的状况进行必要的监测,以防此种情况发生,或者能在发生时及时发现问题并解决之。
Linux提供了一个非常强大的工具用于显示打开文件,这就是lsof。有了这个命令,监测系统运行状况就相当于如虎添翼,特别是在诊断故障时,它更是能为你指明方向。在RedHat中,lsof一般都默认装好了,而对于其他发行版本的Linux,如果没有这个命令,可以去下载安装lsof这个安装包。
下面我们来看看lsof的常用选项:
1、 lsof +p pid
该选项列出了进程pid相关的打开文件,显示的项目包括:进程名(COMMAND)、进程id(PID)、运行进程的用户名(USER)、文件描述符(FD)、文件类型(TYPE)、设备号(DEVICE)、文件大小(SIZE)、i节点号(NODE)和文件完整路径(NAME)。
2、lsof -u uname
该选项列出用户uname相关的打开文件。
3、lsof fname
该选项列出所有正在使用文件fname的进程和用户。
4、lsof -i
该选项列出所有网络相关的打开文件(套接字文件)。在-i后面可以接参数,如TCP、UDP、TCP:http、TCP:80之类的,以显示指定类型或端口的打开文件。其实这就相当于查看网络连接,与netstat命令有异曲同工之效,而且命令更简单。
5、lsof -c command
该选项列出命令或程序command相关的打开文件。
6、lsof devname
该选项列出设备devname相关的打开文件。
7、lsof +D dirname
该选项列出目录dirname相关的打开文件。
为了让大家更深刻地领悟lsof的用处,下面设定一些典型应用场景:
1、 统计某个进程或命令所打开的文件数,这样可以检查是否有进程的打开文件数超限。
举例:lsof -c oracle | wc -l
2、统计某个端口的网络连接数,这样可以检查某个端口的网络连接是否过多而引起异常。
举例:lsof -i tcp:80 | wc -l
3、在修改或删除某个文件前查看该文件是否正在使用,如正在使用,查看是什么程序在使用它,以便于在修改或删除前先行关闭使用它的程序。
举例:lsof /etc/passwd
4、单独查看使用某个目录的进程ID。
举例:lsof +D /usr/bin | awk ‘{ print $2 }’
5、知道某个端口号,要确定使用该端口的程序是什么。
举例:lsof -i tcp:8080 | awk ‘{ print $1 }’
本文出自 “第二次启航” 博客,转载请与作者联系!
原文地址:http://riser.blog.51cto.com/252482/1429364