Linux lsof命令详解:系统文件与网络连接监控
lsof(List Open Files)是一个功能强大的系统工具,用于列出当前系统中被进程打开的文件。在类Unix系统中,包括网络套接字在内的所有资源都被视为文件,因此该命令能提供极为全面的系统活动视图。
lsof支持大量选项,其基本命令格式如下:
usage: [-?abhlnNoOPRstUvV] [+|-c c] [+|-d s] [+D D] [+|-f[cgG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+|-M] [-o [o]]
[-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
核心参数说明
- 无参数:默认列出所有活跃进程打开的文件。
-a:将后续选项的结果进行"与"运算(默认为"或"运算)。-l:输出中显示用户ID而非用户名。-t:仅输出进程ID。-U:列出UNIX域套接字。-F:指定输出格式,便于其他程序解析。
网络连接监控
lsof常用于分析系统的网络活动,语法为:lsof -i[46] [protocol][@hostname|hostaddr][:service|port]。
查看所有网络连接
lsof -i
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
dhcpcd 6061 root 4u IPv4 4510 UDP *:bootpc
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
查看指定协议或端口的连接
- 仅显示IPv6连接:
lsof -i 6 - 仅显示TCP连接:
lsof -iTCP - 查看占用22端口的进程:
lsof -i:22
基于主机过滤连接
- 查看与特定主机的连接:
lsof -i@192.168.1.100 - 查看主机特定端口的连接:
lsof -i@192.168.1.100:80
连接状态过滤
- 列出监听端口:
lsof -i -sTCP:LISTEN或lsof -i | grep -i LISTEN - 列出已建立的连接:
lsof -i -sTCP:ESTABLISHED或lsof -i | grep -i ESTABLISHED
用户与进程信息
按用户查看
- 查看用户打开的文件:
lsof -u username - 查看除指定用户外的其他用户活动:
lsof -u ^username - 终止用户的所有进程:
kill -9 $(lsof -t -u username)
按命令或进程查看
- 查看命令使用的资源:
lsof -c process_name - 查看指定PID打开的文件:
lsof -p 1234 - 仅获取进程ID:
lsof -t -c sshd
文件与目录监控
- 查看与目录交互的进程:
lsof /var/log/ - 查看与特定文件交互的进程:
lsof /path/to/file
高级应用示例
- 组合查询(用户与网络):
lsof -u user1 -i @10.0.0.1 - 向进程发送信号:
kill -HUP $(lsof -t -c nginx) - 查找链接数为0的文件(可能被隐藏):
lsof +L1 - 查看端口范围的连接:
lsof -i @hostname:1000-2000