lsof list open files

lsof list open files

默认不自带,需要安装:yum install lsof

lsof(list open files) 是一个列出当前系统打开文件的工具。在 linux 环境下,任何事物都以文件的形式存在,这个命令就是这句话的最实际的体现,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的,最好用 root 权限使用 lsof 命令

lsof [options] filename

常用例子:

lsof abc.txt:显示开启文件 abc.txt 的进程,比如可以查看有谁在查看 tomcat 的日志:lsof catalina.out

-c 参数

lsof -c abc:显示 abc 进程现在打开的文件,比较常用的就是 lsof -c java 用于重启 Tomcat 的时候释放端口,或者查看 tail 命令:lsof -c tail

-p 参数

lsof -p 10503:列出进程号为 1234 的进程所打开的文件

-g 参数

lsof -g gid:显示归属 gid 组 ID 的进程情况

-u 参数

lsof -u uid:显示归属 uid 用户 ID 的进程情况,比如 lsof -u lk

还可以在 id 前面加上 ^ 表示“非”,比如 lsof -u { #lk} :查看不是用户 lk 的进程的文件使用情况 (^ 是取反的意思)

其他配置也可以使用 ^ 参数,比如 lsof -u { #lk}

-a 参数:lsof -a  -u lk -c tail lk 使用 tail 打开的文件

+d 参数

lsof +d /usr/local/:显示目录下被进程开启的文件,比如,显示 bin 目录下被打开的文件: lsof  +d bin/

显示由用户 lk 打开的 logs 目录下的文件:lsof -a -u lk +d logs/

+D 参数

lsof +D /usr/local/ 同上,但是会递归搜索目录下的目录,时间较长

-d 参数

lsof -d 4:显示使用 fd 文件描述符为 4 的进程

-i 参数

lsof -i 用以显示符合条件的进程情况,格式为:

lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

最常用的用法就是查看端口的使用情况:lsof -i:9000

带上 -r 参数,不断查看目前 ftp 连接的情况

其他例子:

lsof -i | head -20 | tail:使用 -i 选项显示网络连接

lsof -i 4 | head:仅获取 IPV4 的流量,如果想获取 IPV6 的流量的话,把 4 改成 6 即可

lsof -i tcp |head:显示所有 tcp 连接,如果想显示 udp 连接就把 tcp 改成 udp 即可

lsof -i @172.16.20.143:使用 -i @host 显示该主机是否连接了指定主机,使用 -i @host:port 显示该主机是否通过某个指定端口连接指定主机

lsof -i -stcp:LISTEN |head:找出所有监听的文件,把 LISTEN 换成 ESTABLISHED 表示显示所有建立连接的文件

结果表格中,各列的意思: