目录
1. 概述
lsof 命令用于列出进程打开的文件描述符(FD),包括普通文件、目录、设备文件、网络套接字(如 TCP/UDP 连接)、管道等。它在调试进程行为、排查资源占用(如端口、文件)或释放磁盘空间等问题时非常有用。其基本语法为:
lsof [选项] [条件]
- 选项:控制输出内容或过滤方式,如
-p(指定进程)、-i(网络文件)。 - 条件:指定查找目标,如文件名、端口、PID、用户等。
常用命令总结:
- 查看进程文件:
lsof -p $(pgrep -f nginx) - 查看网络连接:
lsof -i TCP或lsof -i :80 - 查看用户文件:
lsof -u apache - 查看文件占用:
lsof /path/to/file - 查找已删除文件:
lsof +L1或lsof | grep deleted - 查看临时文件:
lsof | grep '/tmp/' - 查看工作目录:
lsof -p <PID> | grep cwd - 排查幽灵文件:
lsof | grep deleted | awk '{print $2,$4,$9}' | sort -u
2. 前提条件
- 权限:普通用户可查看自己进程的文件,部分操作(如查看所有进程或系统文件)需
root权限。 - 工具:
lsof通常预装在 Linux 系统中,属于lsof包。若缺失,可安装:sudo apt update && sudo apt install lsof # Debian/Ubuntu sudo yum install lsof # CentOS/RHEL - 注意:大量输出可能需要结合
grep、awk或分页工具(如less)处理。
3. 常用选项和用法
以下是 lsof 的常用选项及其功能:
-
基本选项:
-p PID:列出指定进程 ID(PID)打开的文件。-u USER:列出指定用户打开的文件。-i [PROTOCOL]:列出网络文件(如 TCP/UDP 连接),可指定协议、地址或端口。-a:逻辑与,组合多个条件。+L1:列出链接数为 0 的文件(通常是被删除但仍被占用的文件)。+fg:显示文件描述符(FD)标志,详细列出文件访问模式。
-
输出字段:
COMMAND:进程名称。PID:进程 ID。USER:运行进程的用户。FD:文件描述符(如cwd表示工作目录,txt表示可执行文件,数字表示文件句柄)。TYPE:文件类型(如REG表示普通文件,DIR表示目录,IPv4表示网络套接字)。NAME:文件路径或网络连接信息。
4. 常用示例
以下是 lsof 命令的常见用法,涵盖查看进程文件、网络连接、端口占用和高级场景。
4.1 查看指定进程打开的文件
列出 nginx 进程打开的所有文件:
lsof -p $(pgrep -f nginx)
- 说明:
pgrep -f nginx:查找nginx进程的 PID。-p:指定 PID,列出该进程打开的文件(包括文件、目录、套接字等)。
- 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 12345 www-data cwd DIR 8,1 4096 123456 /var/www nginx 12345 www-data 0u CHR 1,3 0t0 1234 /dev/null
4.2 查看网络连接
列出所有 TCP 连接:
lsof -i TCP
- 说明:
-i TCP列出所有 TCP 网络连接(包括监听和已建立的连接)。 - 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1234 root 3u IPv4 123456 0t0 TCP *:22 (LISTEN)
列出所有 UDP 连接:
lsof -i UDP
4.3 查看指定用户打开的文件
列出用户 apache 打开的所有文件:
lsof -u apache
- 说明:
-u apache列出apache用户的进程打开的文件。 - 注意:需确保用户存在,可用
id apache确认。
4.4 查看端口占用
查看占用 80 端口的进程:
lsof -i :80
- 说明:
-i :80列出绑定到端口 80(HTTP)的进程。 - 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 12345 www-data 4u IPv4 123456 0t0 TCP *:80 (LISTEN)
查看特定协议和端口(如 TCP 30000):
lsof -i TCP:30000
4.5 组合过滤(查找进程的日志文件)
查找 java 进程打开的 .log 文件:
lsof -p $(pgrep java) | grep '\.log$'
- 说明:
-p $(pgrep java):指定java进程的 PID。grep '\.log$':过滤以.log结尾的文件。
- 示例输出:
java 5678 user 10w REG 8,1 1024 123456 /var/log/app.log
4.6 显示文件描述符标志
列出指定进程(PID 为 <PID>)的文件描述符详细信息:
lsof -p <PID> +fg
- 说明:
+fg显示文件描述符的标志(如读写模式),<PID>需替换为实际进程 ID。 - 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF FLAG NODE NAME bash 1234 user cwd DIR 8,1 4096 0x00 1234 /home/user
4.7 查看文件被谁占用
查看文件 /path/to/file 被哪些进程占用:
lsof /path/to/file
- 说明:直接指定文件路径,列出打开该文件的进程。
- 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cat 5678 user 3r REG 8,1 1024 123456 /path/to/file
4.8 查看被删除但仍占用的文件
查找已被删除但仍被进程占用的文件(链接数为 0):
lsof +L1
- 说明:
+L1:列出链接数小于 1 的文件(通常是被删除但仍被进程持有的文件)。- 这些文件可能导致磁盘空间未释放。
- 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NAME java 5678 user 10w REG 8,1 1048576 0 /tmp/deleted.log (deleted)
查找特定文件的占用(包括已删除):
lsof /path/to/file | grep deleted
4.9 查看进程占用端口
查看指定进程(如 nginx)的 TCP 端口占用:
lsof -p $(pgrep -f nginx) | grep TCP
查看指定 PID 的 UDP 端口占用:
lsof -p <PID> | grep UDP
- 说明:过滤
TCP或UDP连接,检查进程的网络活动。
4.10 查找所有进程打开的临时文件
查找 /tmp 目录下被进程打开的文件:
lsof | grep '/tmp/'
- 说明:
grep '/tmp/'过滤路径包含/tmp/的文件,适用于查找临时文件占用。
4.11 查看进程工作目录
查看指定进程(PID 为 <PID>)的工作目录(cwd):
lsof -p <PID> | grep cwd
- 说明:
grep cwd过滤进程当前工作目录(FD列为cwd)。 - 示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1234 user cwd DIR 8,1 4096 1234 /home/user
4.12 查找导致磁盘空间未释放的“幽灵文件”
查找所有被删除但仍被占用的文件,并提取关键信息:
lsof | grep deleted | awk '{print $2,$4,$9}' | sort -u
- 说明:
grep deleted:过滤标记为(deleted)的文件。awk '{print $2,$4,$9}':提取 PID、文件描述符和文件名。sort -u:去重输出。
- 示例输出:
5678 10w /tmp/deleted.log - 用途:用于排查磁盘空间未释放问题,可通过终止相关进程(如
kill <PID>)释放空间。
5. 高级技巧
5.1 跟踪文件访问(结合 strace)
跟踪命令 <command> 的文件访问行为(需 root 权限):
strace -f -e trace=file <command>
- 说明:
-f:跟踪子进程。-e trace=file:仅跟踪文件相关系统调用。
- 示例:跟踪
cat命令的文件访问:sudo strace -f -e trace=file cat /tmp/test.txt
5.2 查找指定目录下所有打开的文件
查找 /var/log 目录下被进程打开的文件:
lsof +D /var/log
- 说明:
+D递归列出指定目录及其子目录中被打开的文件。
5.3 限制输出到特定协议
列出所有 IPv4 网络连接:
lsof -i 4
列出所有 IPv6 网络连接:
lsof -i 6
5.4 周期性监控
持续监控端口 80 的占用情况:
watch -n 1 "lsof -i :80"
- 说明:
watch -n 1每秒刷新一次输出。
6. 验证和调试
- 过滤输出:
lsof输出可能很长,使用grep或awk过滤:lsof -i TCP | grep LISTEN - 分页查看:结合
less或more处理大量输出:lsof -u apache | less - 检查命令状态:确认
lsof执行是否成功:echo $?- 0:成功。
- 1:无匹配结果(可能正常)或错误。
7. 注意事项
- 权限问题:部分系统文件或进程信息需
root权限:sudo lsof -i :80 - 性能影响:
lsof扫描所有打开文件可能消耗资源,特别是在大量进程或文件系统上。建议使用具体条件(如-p、-i)缩小范围。 - 已删除文件:被删除但仍被占用的文件(
deleted)会导致磁盘空间未释放,可通过终止进程或重启服务释放。 - 网络连接:
-i选项支持多种格式,如-i TCP:80、-i @192.168.1.100(指定 IP)。 - 跨平台差异:不同 Linux 发行版或 Unix 系统(如 macOS)的
lsof选项可能略有不同,建议查看man lsof。
浙公网安备 33010602011771号