lsof list open files

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

lsof list open files

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

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

1
lsof [options] filename
  • 无选项:默认列出所有打开的文件相关信息

  • file:列出打开指定文件的进程。常用

  • -a:使用 AND 逻辑,合并选项输出内容。常用

  • -c <进程名>:列出指定进程名(有时候可以直接等价于命令名,比如tailgrep等等)所打开的文件。常用

  • -p <进程号>:列出指定进程号所打开的文件。常用

  • -g:列出 GID 号进程详情。常用

  • -u:列出 UID 号进程详情。常用

  • -i <条件>:列出符合条件的进程。(4、6、协议、:端口@ip常用

  • -d <文件号>:列出占用该文件描述符的进程

  • +d <目录>:列出目录下被打开的文件

  • +D <目录>:递归列出目录下被打开的文件

  • -n <目录>:列出使用 NFS 的文件

  • -U:获取 UNIX 套接口地址

  • -t:列出进程

  • -h:显示帮助信息

  • -v:显示版本信息

常用例子:

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用以显示符合条件的进程情况,格式为:

1
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  • 46:IPv4 or IPv6  

  • protocol:TCP or UDP  

  • hostname:Internet host name  

  • hostaddr:IPv4 地址  

  • service:/etc/service中的 service name (可以不止一个)  

  • port:端口号 (可以不止一个)

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

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

  • -rlsof会永远不断的执行,直到收到中断信号

  • +rlsof会一直执行,直到没有档案被显示,缺省是 15s 刷新)

其他例子:

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 表示显示所有建立连接的文件

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

  • COMMAND:进程的名称

  • PID:进程标识符

  • PPID:父进程标识符(需要指定-R 参数)

  • USER:进程所有者

  • FD:文件描述符,应用程序通过文件描述符识别该文件。

    • cwd:表示 current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

    • txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序

    • lnn:library references (AIX);

    • er:FD information error (see NAME column);

    • jld:jail directory (FreeBSD);

    • ltx:shared library text (code and data);

    • mxx :hex memory-mapped type number xx.

    • m86:DOS Merge mapped file;

    • mem:memory-mapped file;

    • mmap:memory-mapped device;

    • pd:parent directory;

    • rtd:root directory;

    • tr:kernel trace file (OpenBSD);

    • v86 VP/ix mapped file;

    • 0:表示标准输出

    • 1:表示标准输入

    • 2:表示标准错误

    一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

    • u:表示该文件被打开并处于读取/写入模式。

    • r:表示该文件被打开并处于只读模式。

    • w:表示该文件被打开并处于写入状态。

    • 空格:表示该文件的状态模式为 unknow,且没有锁定。

    • -:表示该文件的状态模式为 unknow,且被锁定。

  • TYPE:文件类型

    • DIR:表示目录。

    • CHR:表示字符类型。

    • BLK:块设备类型。

    • UNIX:UNIX 域套接字。

    • FIFO:先进先出 (FIFO) 队列。

    • IPv4:网际协议 (IP) 套接字。

  • DEVICE:指定磁盘的名称

  • SIZE/OFF:文件的大小

  • NODE:索引节点(文件在磁盘上的标识)

  • NAME:打开文件的确切名称(绝对路径)

0%