lsof(list open files)是Linux/Unix系统中用于列出当前系统打开文件的强大工具。在Linux中,“一切皆文件”的理念下,lsof不仅能够显示普通文件,还能显示网络连接、管道、设备文件、目录等各种被进程打开的资源。
lsof是系统管理和故障排查的利器,常用于:查看端口占用、找出阻止卸载的进程、定位文件被哪个进程占用、排查磁盘空间未释放问题、分析进程打开的文件句柄等。掌握lsof能够帮助管理员快速定位和解决各类资源占用问题。
1. 基本语法
| 命令 | 说明 |
|---|
lsof | |
sudo lsof | |
lsof /path/to/file | |
lsof -p 1234 | |
lsof -u username | |
2. 端口与网络检查
| 命令 | 说明 |
|---|
sudo lsof -nP -iTCP:80 -sTCP:LISTEN | |
sudo lsof -i | |
sudo lsof -i TCP | |
sudo lsof -i UDP | |
sudo lsof -i:22 | |
sudo lsof -i@192.168.1.100 | |
sudo lsof -nP -iTCP:443 -sTCP:LISTEN | |
sudo lsof -iTCP:1-1024 | |
常用组合说明:
3. 进程与用户过滤
| 命令 | 说明 |
|---|
sudo lsof -p 1234 | |
sudo lsof -p ^1234 | |
sudo lsof -p 1234,5678 | |
sudo lsof -c nginx | |
lsof -u john | |
sudo lsof -u ^john | |
sudo lsof -u root -i | |
sudo lsof -u john -i :8080 | |
4. 文件与目录检查
| 命令 | 说明 |
|---|
lsof /var/log/nginx/access.log | |
sudo lsof +d /var/log | |
sudo lsof +D /var/log | |
sudo lsof +D /mountpoint | |
sudo lsof /dev/sda | |
lsof -a -p 1234 -d cwd | |
lsof -d txt | |
lsof /usr/lib/*.so | |
5. 已删除文件与磁盘空间
当文件被删除但仍有进程打开时,磁盘空间不会释放:
| 命令 | 说明 |
|---|
sudo lsof +L1 | |
sudo lsof +L1 /var | |
sudo lsof -a +L1 -u nginx | |
sudo lsof +L1 | sort -k7 -n | |
sudo lsof +L1 | grep deleted | |
sudo lsof +L1 | grep -v deleted | |
解决磁盘空间未释放:
# 1. 找到持有已删除文件的进程
sudo lsof +L1 | grep deleted
# 2. 重启该进程(或发送信号)
sudo kill -9 PID
# 或重启服务
sudo systemctl restart service_name
6. 脚本与组合过滤
| 命令 | 说明 |
|---|
sudo lsof -t -iTCP:8080 -sTCP:LISTEN | |
sudo lsof -a -u john -i TCP | |
sudo lsof -a -p 1234 -d cwd | |
sudo lsof -Fn -p 1234 | |
sudo kill $(lsof -t -i:8080) | |
sudo lsof -t -i:22 | xargs -r ps -fp | |
-a 选项说明: 默认多个条件是OR关系,使用-a可将条件转为AND关系。
7. 文件描述符类型
| 类型 | 说明 |
|---|
cwd | |
txt | |
mem | |
REG | |
DIR | |
CHR | |
BLK | |
FIFO | |
IPv4/IPv6 | |
unix | |
8. 输出字段说明
| 字段 | 说明 |
|---|
COMMAND | |
PID | |
TID | |
USER | |
FD | 文件描述符(cwd=目录,txt=可执行,mem=内存映射) |
TYPE | 文件类型(REG=普通文件,DIR=目录,IPv4=网络) |
DEVICE | |
SIZE/OFF | |
NODE | |
NAME | |
9. 实用组合模式
| 命令 | 说明 |
|---|
sudo lsof -i -n -P | grep LISTEN | |
sudo lsof -i -n -P | grep ESTABLISHED | |
lsof -u $(whoami) -a -i | |
sudo lsof -i :80 -i :443 | |
sudo lsof -c ssh -i | |
lsof +L1 -a -u www-data | |
watch -n 1 "lsof -i :80" | |
sudo lsof | awk '{print $2}' | sort | uniq -c | sort -rn | head | |
10. 常用选项速查
| 选项 | 完整名称 | 说明 |
|---|
-i | | |
-i:port | | |
-iTCP | | |
-iUDP | | |
-n | | |
-P | | |
-p | | |
-u | | |
-c | | |
-d | | |
+d | | |
+D | | |
+L1 | | |
-t | | |
-a | | |
-F | | |
11. 故障排查
| 问题 | 解决方法 |
|---|
| 输出不完整 | |
| 端口显示服务名而非数字 | |
| 无法卸载磁盘 | 使用sudo lsof +D /mountpoint找出占用进程 |
| 磁盘空间未释放 | 使用sudo lsof +L1找出已删除但未释放的文件,重启对应进程 |
| lsof运行缓慢 | 限制搜索范围;使用+d而非+D;使用-b选项跳过内核信息 |
| 权限被拒绝错误 | |
| 需要监听端口而非所有连接 | |
| 连接状态显示奇怪 | 网络连接状态说明:LISTEN(监听)、ESTABLISHED(已建立)、CLOSE_WAIT(等待关闭)等 |
温馨提示: lsof是非常强大的诊断工具,但输出信息量大,建议先缩小搜索范围再分析。排查问题时,遵循以下顺序:先用lsof -i看网络,再用lsof +D查目录占用,最后用lsof +L1找已删除文件。在脚本中使用-t选项获取PID并传递给其他命令。对于大量文件句柄的进程,可用lsof -p PID \| wc -l统计打开文件数,帮助排查文件描述符泄漏。