许吉友 - 运维

lsof 命令详解

lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。

lsof打开的文件可以是:

  1. 普通文件
  2. 目录
  3. 网络文件系统的文件
  4. 字符或设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 网络文件(例如:NFS file、网络socket,unix域名socket)
  9. 还有其它类型的文件,等等

命令参数

实例

无参数:

image-20200330204512389

查看某个文件相关的进程

$ lsof -R /bin/bash
COMMAND     PID  PPID  USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
domain.sh 11689     1 admin txt    REG  253,2   964600 12583347 /usr/bin/bash
launch.sh 23250     1 admin txt    REG  253,2   964600 12583347 /usr/bin/bash
standalon 23252 23250 admin txt    REG  253,2   964600 12583347 /usr/bin/bash
bash      29478 29477 admin txt    REG  253,2   964600 12583347 /usr/bin/bash
$ sudo lsof -R /var/run/docker.sock
COMMAND  PID PPID USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd    1    0 root   89u  unix 0xffff880819eb5800      0t0 19686 /var/run/docker.sock
dockerd 3060    1 root    3u  unix 0xffff880819eb5800      0t0 19686 /var/run/docker.sock
dockerd 3060    1 root    7u  unix 0xffff8808194ad000      0t0 29834 /var/run/docker.sock

列出某个用户打开的文件的信息

$ sudo lsof -u admin
$ sudo lsof -u etcd

列出某个程序打开的文件

$ sudo lsof -c mysql
$ sudo lsof -c docker

列出某个 PID 打开的文件

$ sudo lsof -p 2864

列出所有的网络连接

$ sudo -i
$ sudo lsof -i 4
$ sudo lsof -i:443
$ sudo lsof -i @127.0.0.1
$ sudo lsof -i tcp

列出与文件描述符相关的进程

上面说过,FD 代表的是文件描述符,这里列出使用了同一文件描述符的进程列表

$ sudo lsof -d 62

说明: 0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

列出 fueltank-1 上 6443 端口的进程,每三秒刷新一次

 $ sudo lsof -i @fueltank-1:6443 -r 3

####