当前位置:首页>Linux>Linux命令——lsof分析说明

Linux命令——lsof分析说明

  • 2026-10-11 07:50:05
Linux命令——lsof分析说明

一、linux中命令操作

有过Linux开发经验的开发者都知道,在Linux中命令操作是一种基础的入门技术。如果是早期接触Linux并与其一同不断成长的开发者可能理解更深刻,不同的版本或不同的系统都提供了各种各样的强大的命令。而且这些命令自身也在不断的发展,新的命令也在不断的升级或者替换成更强大的一些命令。

二、lsof命令

Linux中一切皆文件,这也意味着,如果有一个强大的文件处理命令,那么很多相关的操作都可以使用这个命令。正所谓,你能想到的,大佬也能想到。所以它来了,lsof,list open files(看英文就知道它大概是干啥的了)。这个命令相当强大,它可以把对普通文件、网络操作、管道等等相关的命令操作整合在一起。尽量减少使用者对命令过多种类的依赖。
其基础的应用格式如下:

lsof[选项][文件名|进程名|...]

其常见的选项参数包括:

选项
含义
示例
-i
查看网络文件/socket
lsof -i
-i :端口
查看指定端口
lsof -i :8080
-i TCP
查看 TCP 连接
lsof -i TCP
-i UDP
查看 UDP 连接
lsof -i UDP
-i4
只查看 IPv4
lsof -i4
-i6
只查看 IPv6
lsof -i6
-P
不把端口号转换为服务名
lsof -P -i :80
-n
不解析主机名
lsof -n -i
-p
按 PID 查询
lsof -p 1234
-u
按用户查询
lsof -u fpc
-c
按进程名查询
lsof -c nginx
-a
多个条件取交集
lsof -a -u fpc -i
+D
递归查看目录下被打开的文件
lsof +D /mnt/data
+d
只查看指定目录本层,不递归
lsof +d /var/log
+L1
查看已删除但仍被占用的文件
lsof +L1
-sTCP:LISTEN
查看 TCP 监听状态
lsof -iTCP -sTCP:LISTEN
-sTCP:ESTABLISHED
查看已建立 TCP 连接
lsof -iTCP -sTCP:ESTABLISHED
-t
只输出 PID
lsof -t -i :8080
-r
持续刷新输出
lsof -r 2 -i :8080
-F
机器可读格式输出
lsof -F -p 1234

其常见的输出选项有:

字段
含义
COMMAND
进程名
PID
进程ID
USER
所属用户
FD
文件描述符,如0:stdin,cwd:当前目录等
TYPE
文件类型,DIR:目录,IPv4:网络套接字等
DEVICE
设备号
SIZE/OFF
文件大小或偏移量
NODE
inode 号
NAME
文件名、端口、连接等

FD文件描述符的种类和说明:

FD
含义
cwd
当前工作目录
txt
程序可执行文件
mem
内存映射文件
0u
标准输入
1u
标准输出
2u
标准错误
3u
第 3 个文件描述符,可读写
r
只读
w
只写
u
读写

前面介绍过不少的命令,它们其实都可以完成相同的功能。比如使用ss和netstat查看端口占用就可以使用lsof命令来替代。

三、lsof命令的应用

lsof命令可以支持的常见操作文件类型包括:普通文件,文件目录,网络,管理,设备文件以及动态库和进程文件等等。不建议什么命令选项都不使用的调用lsof命令,它会出现大量的结果,让屏幕根本看不到想关心的部分。
其常见的应用场景有:

  1. 查看网络的连接状态

    lsof -i tcp    #查看所有TCP连接
    lsof -i udp
    lsof -i TCP -sTCP:LISTEN  #查看正在监听的TCP端口
    lsof -i TCP -sTCP:ESTABLISHED #查看已建立连接
  2. 端口进程占用的情况

    lsof -i :8888#查看指定端口占用者
  3. 进程占用的文件状态
    这个非常实用:

    lsof -p 3717   #查看利用PID打开的文件
    lsof -c obsidian  #查看利用进程名打开的文件
    lsof -u test  #查看test用户打开的文件
    lsof +D ~/data  #查看指定目录下的文件被哪些进程占用,这在进程占用文件无法删除时非常有用
    #可以进一步操作:删除所有占用指定文件的进程(小心处理)
    kill-9lsof -t /path/file
  4. 磁盘空间的文件占用状态,特别是已删除的文件
    这个也非常好使,用处非常大:

    lsof | grep deleted    #删除但未释放文件
    lsof +L1   # 精确查找
    lsof /mnt/demo   #指定挂载点进程占用
    lsof -f -- /dev/sda2    #全部挂载点的使用
  5. 文件无法卸载或删除
    可以混合使用上面的文件、目录和进程占用等命令,查找到相关原因,再进行卸载和删除:

    lsof -c obsidian

    lsof +D ~/data 

    lsof /mnt/demo

    kill -9 `lsof -t /path/file`  #删除

    apt remove package-name #卸载 

四、命令的高级应用

在Linux中通过多个命令的组合可以实现更复杂更精细的命令处理,实现高级的应用。下面看一下lsof的常见的组合高级应用:

  1. 查找大文件
    这个在服务器开发中用处非常大,用来过滤一些对空间有影响的大文件:

    lsof | awk '$7 ~ /^[0-9]+$/ && $7 > 1000000 {print $2, $7, $9}' | sort -k2 -nr
  2. 高级的网络用法

    lsof-Pan-iTCP:9999-sTCP:LISTEN # 查看9999端口的监听进程
    lsof-Pan-iTCP-sTCP:LISTEN  # 查看全部监听端口
    lsof-Pan-p 3717 -i  #指定进程监听哪些端口
    lsof-r 5 -i:8080#5秒刷新查看

在实际的工作中,可以通过各种高级的组合用法,甚至开发成脚本,共同完成指定的任务需求。其实大家不必担心过于复杂,现在AI的引入,使得脚本的开发几乎变成了一个非常简单的行为。

五、实践中的问题

lsof命令虽然很强大,但也有一些限制情况。比如在查看某些文件时,需要root权限,而且其输出相对要复杂很多,除了常见的一些字段,其内容说明很多。这就需要应用者能够仔细的查看相关的说明文档(当然,现在直接可以问AI)。当然,lsof也存在着很多命令同样的缺点,就是直接使用它,有可能会影响到监控的系统的性能,甚至导致出现一些异常。这都需要应用者自行处理和决定。“工具虽好,但也不能乱用”。

六、总结

对于习惯于图形界面应用或开发的人来说,对于命令操作一般都会有一些抵触心理。其实命令操作并不难,常见的命令也没有想象的那么多。特别在一些服务器环境中,只能使用命令进行操作。所以对于想接触Linux系统的人来说,接受并掌握一些命令操作,是一种必然的选择。

最新文章

随机文章