对于某些耗资源的应用,诸如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 }