在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。
常用选项
-a指示其它选项之间为与的关系
-c<进程名> 输出指定进程所打开的文件
-d<文件描述符> 列出占用该文件号的进程
+d<目录> 输出目录及目录下被打开的文件和目录(不递归)
+D<目录> 递归输出及目录下被打开的文件和目录
-i<条件> 输出符合条件与网络相关的文件
-n不解析主机名
-p<进程号> 输出指定 PID 的进程所打开的文件
-P不解析端口号
-t只输出 PID
-u输出指定用户打开的文件
-U输出打开的 UNIX domain socket 文件
-h显示帮助信息
-v显示版本信息
基本输出
如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:

COMMAND:程序的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件 NAME:打开文件的确切名称
TYPE:文件类型,如 DIR、REG等 DEVICE:以逗号分隔设备编号 SIZE:文件的大小(bytes) NODE:索引节点(文件在磁盘上的标识)
下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件:

\数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!