lsof 是什么
lsof 列出进程打开的所有文件,包括普通文件、目录、设备与网络套接字。按进程、路径、用户、端口都能过滤。它是排查句柄泄漏、文件被谁占用、已删除文件仍占空间这三类问题的首选工具。代价是全量扫描开销不小,生产上要记得带过滤条件。
基本信息
| 适用平台 | Linux、Unix;多数发行版需要单独安装 |
|---|---|
| 命令语法 | lsof [选项] [路径 | 目录 | 端口 | 进程号] |
| 常用选项 | -p 按进程 / -c 按命令名 / -u 按用户 / -i 网络 / +D 递归目录 / +L1 已删除文件 / -t 只输出 PID / -n、-P 不解析名称 |
| 权限要求 | 查看他人进程需要 root |
典型使用场景
- 查端口被谁占用,配合网络类问题排查
- 准备卸载或修改文件前,确认它被哪个进程打开
- 排查句柄泄漏:定期统计某进程的打开文件数
- 找出已经被删除但仍在占空间的文件
- 安全排查:列出某个进程的全部网络连接
常用示例
常用示例
lsof -p 1234 | head -30 # 该进程打开的文件
lsof /var/log/app.log # 谁占着这个文件
lsof -u www-data | wc -l # 某用户的打开文件数
lsof -i :8080 # 谁在用这个端口
lsof +D /data/app | head # 目录下被打开的文件(慢)
lsof +L1 /var/log | head # 已删除但仍被持有的文件
lsof -t /var/log/app.log # 只输出占用者的进程号常用选项
| 选项 | 作用 | 提示 |
|---|---|---|
| -p | 按进程号过滤 | 与进程列表对照定位 |
| -u | 按用户过滤 | 统计某个服务的句柄数 |
| -c | 按命令名前缀过滤 | 匹配多个同类进程 |
| -i | 按网络过滤 | 可再叠加端口或协议 |
| +D | 递归列出目录下的文件 | 开销大,按需使用 |
| +L1 | 链接数为零的文件 | 用来定位已删除文件 |
| -t | 只输出进程号 | 便于交给脚本继续处理 |
不带参数运行会遍历全系统,大机器上又慢又重,还可能因为权限看不到全部结果;生产环境一定要带过滤条件。
查看别人的进程需要 root,出现空结果时先排除权限因素;在容器里操作时还要注意,宿主侧未必能看到容器命名空间里的全部进程。