当前位置:首页>Linux>Linux命令每日一清单026:lsof--打开文件查看命令速查表

Linux命令每日一清单026:lsof--打开文件查看命令速查表

  • 2026-09-05 01:59:57
Linux命令每日一清单026:lsof--打开文件查看命令速查表

lsof(list open files)是Linux/Unix系统中用于列出当前系统打开文件的强大工具。在Linux中,“一切皆文件”的理念下,lsof不仅能够显示普通文件,还能显示网络连接、管道、设备文件、目录等各种被进程打开的资源。

lsof是系统管理和故障排查的利器,常用于:查看端口占用、找出阻止卸载的进程、定位文件被哪个进程占用、排查磁盘空间未释放问题、分析进程打开的文件句柄等。掌握lsof能够帮助管理员快速定位和解决各类资源占用问题。

1. 基本语法

命令说明
lsof
列出当前用户可见的打开文件
sudo lsof
列出系统中所有打开文件
lsof /path/to/file
显示哪个进程打开了该文件
lsof -p 1234
显示指定PID打开的文件
lsof -u username
显示指定用户打开的文件

2. 端口与网络检查

命令说明
sudo lsof -nP -iTCP:80 -sTCP:LISTEN
查找监听TCP 80端口的进程
sudo lsof -i
列出所有网络连接
sudo lsof -i TCP
列出TCP连接
sudo lsof -i UDP
列出UDP连接
sudo lsof -i:22
查找使用端口22的连接
sudo lsof -i@192.168.1.100
显示与指定IP的连接
sudo lsof -nP -iTCP:443 -sTCP:LISTEN
查找监听443端口的进程
sudo lsof -iTCP:1-1024
显示1-1024端口的TCP连接

常用组合说明:

  • -n:不解析主机名(显示IP地址)
  • -P:不解析端口名(显示端口号)
  • -sTCP:LISTEN:仅显示监听状态的连接

3. 进程与用户过滤

命令说明
sudo lsof -p 1234
显示PID 1234打开的文件
sudo lsof -p ^1234
排除PID 1234
sudo lsof -p 1234,5678
显示多个PID打开的文件
sudo lsof -c nginx
显示命令名以nginx开头的进程打开的文件
lsof -u john
显示用户john打开的文件
sudo lsof -u ^john
排除用户john打开的文件
sudo lsof -u root -i
显示root用户的网络连接
sudo lsof -u john -i :8080
显示john用户使用的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
显示指定PID的当前工作目录
lsof -d txt
显示所有打开的可执行文件
lsof /usr/lib/*.so
查找加载指定共享库的进程

5. 已删除文件与磁盘空间

当文件被删除但仍有进程打开时,磁盘空间不会释放:

命令说明
sudo lsof +L1
列出已被删除但仍被进程持有的文件
sudo lsof +L1 /var
限制在指定路径下查找已删除文件
sudo lsof -a +L1 -u nginx
显示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
仅输出监听8080端口的PID
sudo lsof -a -u john -i TCP
显示john用户的TCP连接(-a为AND组合)
sudo lsof -a -p 1234 -d cwd
显示PID 1234的当前工作目录
sudo lsof -Fn -p 1234
机器可读格式输出(脚本用)
sudo kill $(lsof -t -i:8080)
终止占用8080端口的进程
sudo lsof -t -i:22 | xargs -r ps -fp
查看占用22端口的进程详情

-a 选项说明: 默认多个条件是OR关系,使用-a可将条件转为AND关系。

7. 文件描述符类型

类型说明
cwd
当前工作目录
txt
程序文本(可执行文件)
mem
内存映射文件
REG
普通文件
DIR
目录
CHR
字符设备
BLK
块设备
FIFO
命名管道
IPv4/IPv6
网络套接字
unix
UNIX域套接字

8. 输出字段说明

字段说明
COMMAND
进程命令名
PID
进程ID
TID
线程ID(若为线程)
USER
进程所有者
FD
文件描述符(cwd=目录,txt=可执行,mem=内存映射)
TYPE
文件类型(REG=普通文件,DIR=目录,IPv4=网络)
DEVICE
设备号(主设备号,次设备号)
SIZE/OFF
文件大小或偏移量
NODE
inode号
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
显示80和443端口的连接
sudo lsof -c ssh -i
显示SSH相关的网络连接
lsof +L1 -a -u www-data
显示www-data用户持有的已删除文件
watch -n 1 "lsof -i :80"
每秒监控80端口的连接变化
sudo lsof | awk '{print $2}' | sort | uniq -c | sort -rn | head
统计每个进程打开的文件数

10. 常用选项速查

选项完整名称说明
-i
--internet
显示网络连接
-i:port
-
指定端口号
-iTCP
-
仅显示TCP连接
-iUDP
-
仅显示UDP连接
-n
--numeric
不解析主机名
-P
--numeric-ports
不解析端口名
-p
--pid
指定进程ID
-u
--user
指定用户名
-c
--command
指定命令名前缀
-d
--fd
指定文件描述符类型
+d
-
列出目录下打开的文件(不递归)
+D
-
递归列出目录下打开的文件
+L1
-
显示已删除但仍打开的文件
-t
--terse
仅输出PID
-a
--and
多个条件为AND关系
-F
--field
机器可读格式输出

11. 故障排查

问题解决方法
输出不完整
使用sudo查看其他用户的进程
端口显示服务名而非数字
添加-nP参数显示数字端口和地址
无法卸载磁盘
使用sudo lsof +D /mountpoint找出占用进程
磁盘空间未释放
使用sudo lsof +L1找出已删除但未释放的文件,重启对应进程
lsof运行缓慢
限制搜索范围;使用+d而非+D;使用-b选项跳过内核信息
权限被拒绝错误
使用sudo执行
需要监听端口而非所有连接
添加-sTCP:LISTEN过滤监听状态
连接状态显示奇怪
网络连接状态说明:LISTEN(监听)、ESTABLISHED(已建立)、CLOSE_WAIT(等待关闭)等

温馨提示: lsof是非常强大的诊断工具,但输出信息量大,建议先缩小搜索范围再分析。排查问题时,遵循以下顺序:先用lsof -i看网络,再用lsof +D查目录占用,最后用lsof +L1找已删除文件。在脚本中使用-t选项获取PID并传递给其他命令。对于大量文件句柄的进程,可用lsof -p PID \| wc -l统计打开文件数,帮助排查文件描述符泄漏。

本文PDF格式下载:

  关注公众号(haopython),请回复: LLTLSOF

最新文章

随机文章