除了排查“已删除未释放文件”(+L1),lsof作为 Linux 系统管理的“瑞士军刀”,在网络排查、进程分析、设备管理、安全审计等场景中都有不可替代的经典用法。
1.排查文件已删除,空间为释放
lsof+L1-w2>/dev/null|grepdeleted|sort-k7-rn|head-20# lsof:List Open Files,列出当前系统打开的文件。# +L1:这是一个筛选参数,表示列出链接数(Link Count)小于 1 的文件。# -w:禁止截断换行输出,防止长路径截断。lsof +L1就是专门用来把这些已经被删除、但依然占用磁盘空间的文件找出来的。
COMMAND PIDUSERFD TYPE DEVICE SIZE/OFF NLINK NODE NAME nginx1234root 4w REG253,0155446270995536/var/log/nginx/access.log(deleted)java5678app 10w REG253,0391297111920101454061/tmp/app.log(deleted)
(deleted):标记该文件已被删除。NLINK为 0:表示链接数已归零,印证了+L1的筛选条件。SIZE/OFF:显示该文件仍在占用的实际磁盘空间大小,单位byte。
2. 端口占用精准定位(替代 netstat/ss)
当服务启动失败提示Address already in use时,快速找出占用端口的进程。
# 查看谁占用了 8080 端口(推荐加 -nP 禁止解析,速度更快)sudolsof-i:8080-nP# 只查看 TCP 监听状态的端口(排查服务是否正常启动)sudolsof-iTCP-sTCP:LISTEN-nP# 查看某个进程的所有网络连接sudolsof-p1234-i-nP💡 技巧:
-n禁止域名反解,-P禁止端口转服务名,两者组合可避免 DNS 查询导致的卡顿,在故障排查时务必加上。
3. 解决 “Device is busy” 无法卸载问题
卸载磁盘或 NFS 挂载点时报错,用lsof找出还在访问该路径的进程。
# 递归扫描 /mnt/data 下所有被打开的文件sudolsof+D /mnt/data# 非递归扫描(仅当前目录,速度更快)sudolsof+d /mnt/data# 直接指定挂载点sudolsof/dev/sdb1⚠️ 注意:
+D是递归扫描,数据量大时非常慢;如果明确知道问题在当前层,优先用+d。找到进程后,先尝试kill -HUP或优雅停止,而非直接umount -f。
4. 进程资源全透视(调试/性能分析)
分析某个进程打开了哪些文件、库、Socket,判断是否存在句柄泄漏或异常行为。
# 查看 Java 进程打开的所有文件sudolsof-cjava# 统计某进程打开的文件描述符数量(监控句柄泄漏)watch-n1"sudo lsof -p 1234 | wc -l"# 只看普通文件(排除 socket、pipe、mem 等干扰)sudolsof-p1234|awk'$5 == "REG"'# 查看进程的工作目录sudolsof-p1234|awk'$4 == "cwd"'4. 安全审计与异常连接排查
检查系统是否有可疑外连、挖矿程序或非授权用户活动。
# 查看所有 ESTABLISHED 状态的外连(排查矿池/C2通信)sudolsof-i-sTCP:ESTABLISHED-nP|grep-v'127.0.0.1\|::1'# 查看特定用户的网络连接(审计 www-data/nginx 等低权用户)sudolsof-uwww-data-i-nP# 查找 /tmp 或 /dev/shm 下的可疑可执行文件sudolsof+D /tmp|awk'$5 == "REG" && $NF ~ /\.(sh|py|elf)$/'5. 文件级操作追踪
确认某个关键文件(如日志、配置、数据文件)正被哪些进程读写。
# 查看谁在写 /var/log/syslogsudolsof/var/log/syslog# 查看 /etc/passwd 是否被异常读取sudolsof/etc/passwd# 批量检查多个文件sudolsof/var/log/nginx/access.log /var/log/nginx/error.log6. 脚本化集成(仅获取 PID)
在自动化运维脚本中,通常只需要 PID 而不需要完整表格输出。
# 杀掉占用 3306 端口的进程(一行搞定)kill-9$(sudolsof-t-i:3306)# 重启持有某日志文件的进程sudolsof-t/var/log/app.log|xargskill-HUP# 统计每个用户打开的文件数sudolsof-Fu|awk'/^u/{user=$0} /^p/{count[user]++} END{for(u in count) print count[u], u}'|sort-rn💡
-t参数:只输出 PID,无表头、无多余字段,专为管道和脚本设计,是自动化场景的核心选项。
7.使用原则总结
| 原则 | 说明 |
|---|---|
| 必加 sudo | 普通用户看不到其他进程的 fd,排查结果不完整 |
| 必加 -nP | 网络相关查询默认触发 DNS/服务名解析,生产环境必须禁用 |
| 慎用 +D | 递归扫描 I/O 开销大,优先用精确路径或+d |
| 输出是瞬时快照 | lsof反映的是执行那一刻的状态,持续监控需配合watch或-r N |
| 结合 /proc 验证 | 当lsof结果存疑时,直接ls -la /proc/<pid>/fd/是最底层的验证手段 |
掌握以上场景,基本可以覆盖 90% 以上的 Linux 故障排查和安全审计需求。建议将常用命令保存为 shell alias 或函数,提升应急响应效率。加粗样式