运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。
今天我们要讲的是 Lsof 命令。
一、简介
lsof 是 Linux 下的一个非常实用的系统级的监控、诊断工具,它的功能非常强大。它的意思是 List Open Files,字面意思是“打开文件列表“。我们知道,linux 下 “一切皆文件”,所以lsof的作用就显而易见了,它可以用来列出被各种进程打开的文件信息。
二、基本语法
lsof [选项] [绝对路径的文件名]
因为权限等原因,建议使用root用户执行该命令,可以看到全面的信息。
相关参数:
参数 | 说明 |
-a | 列出打开文件存在的进程 |
-c<进程名> | 列出指定进程所打开的文件 |
-g | 列出GID号进程详情 |
-d<文件号> | 列出占用该文件号的进程 |
+d<目录> | 列出目录下被打开的文件 |
+D<目录> | 递归列出目录下被打开的文件 |
-n<目录> | 列出使用NFS的文件 |
-i<条件> | 列出符合条件的进程(协议,:端口,@ip) |
-p<进程号> | 列出指定进程号所打开的文件 |
-u | 列出UID号进程详情 |
-h | 显示帮助信息 |
-v | 显示版本信息 |
示例:
$ lsof
command PID USER FD type DEVICE SIZE NODE NAME
init 1 root cwd DIR 8,2 4096 2 /
init 1 root rtd DIR 8,2 4096 2 /
init 1 root txt REG 8,2 43496 6121706 /sbin/init
init 1 root mem REG 8,2 143600 7823908 /lib64/ld-2.5.so
init 1 root mem REG 8,2 1722304 7823915 /lib64/libc-2.5.so
init 1 root mem REG 8,2 23360 7823919 /lib64/libdl-2.5.so
init 1 root mem REG 8,2 95464 7824116 /lib64/libselinux.so.1
init 1 root mem REG 8,2 247496 7823947 /lib64/libsepol.so.1
init 1 root 10u FIFO 0,17 1233 /dev/initctl
migration 2 root cwd DIR 8,2 4096 2 /
migration 2 root rtd DIR 8,2 4096 2 /
migration 2 root txt unknown /proc/2/exe
上述每一列的意思如下:
列名 | 说明 |
COMMAND | 进程名称 |
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过它识别到该文件,如cwd、txt等 |
TYPE | 文件类型,如DIR,REG |
DEVICE | 指定磁盘名称 |
SIZE | 文件大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
2.1. 文件描述符列表(FD)
- cwd:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
- txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
- lnn:库引用 (AIX)
- er:FD 信息错误
- jld:jail 目录 (FreeBSD)
- ltx:共享库文本(代码和数据)
- mxx:十六进制内存映射类型编号xx
- m86:DOS合并映射文件
- mem:内存映射文件
- mmap:内存映射设备
- pd:父目录
- rtd:根目录
- tr:内核跟踪文件 (OpenBSD)
- v86:VP/ix 映射文件
- 0:表示标准输出
- 1:表示标准输入
- 2:表示标准错误
2.2. 标准输出/输入/错误文件状态模式(FD)
一般在标准输出/输入/错误后还跟着文件状态模式。
文件状态 | 说明 |
u | 表示该文件被打开并处于读取/写入模式 |
r | 表示该文件被打开并处于只读模式 |
w | 表示该文件被打开并处于写入模式 |
空格 | 表示该文件的状态模式为 unknow,且没有锁定 |
- | 表示该文件的状态模式为 unknow,且被锁定 |
2.3. 文件状态模锁 (FD)
一般在文件状态模式后面,还跟着相关的锁。
参数 | 说明 |
N | 对于未知类型的Solaris NFS锁 |
r | 用于部分文件的读取锁定 |
R | 对整个文件进行读取锁定 |
w | 对文件的一部分进行写锁定(文件的部分写锁) |
W | 对整个文件进行写锁定(整个文件的写锁) |
u | 用于任何长度的读写锁 |
U | 对于未知类型的锁 |
x | 对于文件部分的SCO OpenServer Xenix锁 |
X | 对于整个文件的SCO OpenServer Xenix锁 |
space | 如果没有锁 |
2.4. 文件类型(type)
类型 | 说明 |
DIR | 表示目录 |
CHR | 表示字符类型 |
BLK | 块设备类型 |
UNIX | UNIX 域套接字 |
FIFO | 先进先出 (FIFO) 队列 |
IPv4 | 网际协议 (IP) 套接字 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
REG | 常规文件 |
三、Lsof 实例
3.1. Lsof 用户
$ lsof -u test
$ lsof -u test -u ubuntu
$ lsof -i -u ^root # 特定用户除外
3.2. Lsof 文件目录
$ lsof /var/log/messages
$ lsof /etc/passwd
$ lsof +D /var/log # 在目录内,对应目录下的所有子目录和文件都会被列出
3.3. Lsof 端口
$ lsof -i :8080
$ lsof -i :80 -i :22
$ lsof -i TCP:22
$ lsof -i TCP:1-1024
$ lsof -i UDP
$ lsof -i @192.168.1.11
3.4. Lsof 网络
$ lsof -i 4 # 仅 IPv4
$ lsof -i 6 # 仅 IPv6
3.5. Lsof 进程
$ lsof -c mysql
$ lsof -c java
$ lsof -c ssh
$ lsof -c nginx
$ lsof -c ssh -c httpd
$ lsof -p 1753
$ lsof -p ^3 # 除了某些pid
-c 选项将会列出所有以mysql这个进程开头的程序的文件
3.6. 其他
$ lsof -p $pid # 列出指定进程号所打开的文件
$ lsof $filename # 列出打开文件的进程
$ lsof -i:9981 -P -t -sTCP:LISTEN # 获取端口对应的进程 ID