lsof 是 linux 下用于列出进程打开文件及排查资源占用的诊断工具,支持查看端口占用、文件锁定、按用户/进程筛选,并可谨慎终止相关进程。

lsof(list open files)是 Linux 下非常实用的系统诊断工具,不仅能列出进程打开的所有文件(包括普通文件、目录、设备、管道、网络套接字等),还能快速定位端口占用、文件被哪个进程锁定等问题。
查看某个端口被谁占用
当启动服务失败提示“Address already in use”时,常用此方法排查:
- 查 TCP 端口(如 8080):lsof -i :8080
- 查 udp 端口:lsof -iUDP:53
- 只看监听状态的 TCP 进程:lsof -iTCP -sTCP:LISTEN
- 结合 grep 精准过滤:lsof -i :3306 | grep LISTEN
输出中重点关注 PID(进程号)、USER(所属用户)、COMMAND(进程名)和 TYPE(类型,如 IPv4/IPv6、sock)列。
查找某个文件或目录被哪些进程占用
卸载分区失败(”device is busy”)或删除文件提示“Text file busy”时适用:
- 查具体文件:lsof /var/log/syslog
- 查整个目录(含子目录):lsof +D /tmp(注意:+D 会递归扫描,大目录慎用)
- 查某类文件(如所有 .log 文件):lsof | awk ‘$9 ~ /.log$/ {print}’
常见占用场景:日志文件被 tail -f 监听、编辑器未关闭、进程仍在读写该路径下的文件。
按用户、进程或协议筛选
缩小排查范围,提升效率:
- 查指定用户的打开文件:lsof -u nginx
- 查指定进程名:lsof -c sshd
- 只显示网络连接(排除普通文件):lsof -i
- 显示 PID 和对应命令全路径:lsof -i -P -n | head -10(-P 禁用端口名解析,-n 禁用主机名解析,加快输出)
终止占用进程(谨慎操作)
确认无误后可直接 kill:
- 从 lsof 输出中获取 PID,例如为 1234:kill 1234
- 强制终止:kill -9 1234
- 一键杀掉占用某端口的所有进程(高危!请先确认):lsof -t -i :8080 | xargs kill -9
注意:避免误杀系统关键进程(如 systemd、kthreadd),执行前务必核对 COMMAND 和 USER 字段。