lsof
(List Open Files)是 Linux 系统中一个强大的工具,用于列出当前系统所有被打开的文件及相关进程信息。由于 Linux 中“一切皆文件”(包括普通文件、目录、管道、套接字、设备等),lsof
的功能非常广泛。以下是其主要功能详解:
1. 核心功能
列出所有打开的文件:
显示系统中所有被进程打开的文件(默认无参数时输出全部信息)。sudo lsof
按条件过滤:
支持按进程、用户、文件类型等过滤,例如:lsof -u root # 查看 root 用户打开的文件
lsof -c nginx # 查看 nginx 进程打开的文件
lsof -p <PID> # 查看指定 PID 的进程打开的文件
2.关键用途与示例
**(1) 查找占用文件的进程
sudo lsof /var/log/syslog # 查看谁在使用某个文件
**(2) 查找已删除但未释放的文件
sudo lsof +L1 # 列出所有被删除但仍被进程占用的文件
sudo lsof | grep "deleted" # 筛选已被删除的文件
**(3) 查看网络连接
sudo lsof -i # 列出所有网络连接(TCP/UDP)
sudo lsof -i :80 # 查看占用端口80的进程
sudo lsof -i tcp # 仅显示 TCP 连接
**(4) 查看目录或设备的占用
sudo lsof /mnt # 查看谁在访问某个目录
sudo lsof /dev/sda1 # 查看哪个进程在使用磁盘设备
**(5) 恢复误删的文件
通过 /proc/<PID>/fd/
:
# (1)找到持有已删除文件的进程 PID(如 PID=1234)
sudo lsof | grep "deleted"
# (2)从 fd (如 fd=3)恢复内容到新文件
cat /proc/1234/fd/3 > /tmp/recovered_file.txt
3.常用选项速查表
选项 | 作用 |
---|---|
-u <user> |
按用户过滤 |
-c <command> |
按进程名过滤 |
-p <PID> |
按进程 ID过滤 |
-i |
显示网络连接(可加协议或端口) |
+L1 |
显示链接数为0(已删除)的文件 |
-t |
仅输出 PID(适合脚本处理) |
4.高级用法
(1)统计打开的句柄数
lsof -n | wc -l #统计系统总打开文件数
lsof -u nginx | wc -l #统计某用户的打开文件数
(2)结合 grep/awk分析
#找出所有监听端口的 Java程序:
lsof -i -c java | grep LISTEN
#计算被删除但未释放的总大小(MB):
lsof | grep deleted | awk '{sum+=$7} END {print sum/1024/1024 " MB"}'
5.注意事项
- 权限需求:部分信息需
root
权限才能查看。 - 性能影响:在繁忙的系统上直接运行
lsof
可能负载较高,建议配合过滤条件使用。
如果需要针对具体场景进一步分析,可以提供更多上下文!
内容由零声教学AI助手提供,问题来源于学员提问