
一、lsof 是什么?为什么运维都离不开它?
在 Linux 世界里,”万物皆文件”—— 普通文件、目录、网络连接甚至设备,都以文件形式存在。lsof(List Open Files)就是一款能列出系统中所有 “打开文件” 的强劲工具,堪称运维排查问题的 “瑞士军刀”。
它能帮你解决这些头疼问题:
- 端口被占用导致服务启动失败
- 文件删了但磁盘空间没释放
- 想知道某个进程在读写哪些文件
- 排查谁在偷偷访问敏感目录
二、先搞定基础:安装与核心字段解读
1. 快速安装(若系统未预装)
|
# Debian/Ubuntu系统 sudo apt update && sudo apt install lsof # CentOS/RHEL系统 sudo yum install lsof |
提示:多数 Linux 发行版默认预装 lsof,直接输入lsof即可使用。
2. 看懂输出才有用!核心字段解析
执行lsof后会看到多列信息,关键字段含义如下:
|
字段 |
说明 |
示例 |
|
COMMAND |
进程名称 |
nginx |
|
PID |
进程 ID |
12345 |
|
USER |
进程所属用户 |
www-data |
|
FD |
文件描述符(cwd = 工作目录,txt = 程序文件) |
4u(u = 读写模式) |
|
TYPE |
文件类型(REG = 普通文件,IPv4 = 网络连接) |
TCP |
|
NAME |
文件路径 / 网络地址 |
*:80(监听 80 端口) |
三、手把手教:lsof 高频用法速查表
按使用场景分类,这些命令记得收藏!
1. 查进程:看透程序在忙啥
- 查看指定进程打开的文件(以 nginx 为例):
|
lsof -p $(pgrep -f nginx) # pgrep获取nginx的PID |
- 查看某用户的所有进程文件(以 apache 为例):
|
lsof -u apache |
2. 查网络:端口 / 连接全掌握
- 查看 80 端口被哪个进程占用(排查 HTTP 服务冲突):
|
lsof -i :80 # 输出含LISTEN表明正在监听 |
- 列出所有 TCP/UDP 连接:
|
lsof -i TCP # 只看TCP lsof -i UDP # 只看UDP |
3. 查文件:找到 “隐形” 的资源
- 查看谁在使用某个文件(如日志文件):
|
lsof /var/log/syslog |
- 找出被删除但仍占用空间的 “幽灵文件”:
|
lsof +L1 # 链接数为0的文件,删了没释放 |
四、实战为王:lsof 最佳实践 3 大场景
1. 救急!磁盘满了但找不到大文件
场景:df 显示磁盘满,但 du 查不到大文件?大致率是文件删了没释放!
|
# 步骤1:找到被删除的大文件 lsof | grep deleted | awk '{print $2,$9,$7}' # 显示PID、路径、大小 # 步骤2:重启对应进程释放空间,或临时清理(需root) kill -HUP 12345 # 12345为占用文件的PID |
2. 排障!服务启动提示 “端口被占用”
场景:启动 Tomcat 报错 “8080 端口被占用”
|
# 一步定位占用进程 lsof -i :8080 # 输出示例:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME # java 6789 root 4u IPv4 12345 0t0 TCP *:8080 (LISTEN) # 杀死进程:kill -9 6789 |
3. 恢复!误删日志文件能救回
场景:不小心删了 MySQL 日志,进程还在运行就能恢复!
|
# 步骤1:找到占用日志的进程 lsof | grep /var/log/mysql.log | grep deleted # 步骤2:从/proc目录复制文件(PID替换为实际进程ID) cp /proc/12345/fd/3 /var/log/mysql.log # 3是FD列的文件描述符 |
五、避坑指南与效率技巧
- 权限问题:普通用户只能看自己的进程,查系统资源需加sudo。
- 减少输出:结合grep/awk过滤,列如找 java 进程的日志文件:
|
lsof -p $(pgrep java) | grep '.log$' |
- 性能注意:大型服务器上lsof可能耗资源,尽量加过滤条件(如-i/-p)。
总结
lsof 的强劲之处在于能穿透 “文件” 的表象,直抵系统资源的核心。从端口排查到文件恢复,掌握这些技巧能让你运维效率翻倍!赶紧收藏本文,下次遇到问题直接对照实操~
你平时用 lsof 解决过哪些问题?欢迎在评论区分享你的实战经验!
收藏了,感谢分享