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 -9 `lsof -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 -i TCP: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系统的人来说,接受并掌握一些命令操作,是一种必然的选择。

相关推荐
红茶要加冰1 小时前
五、流程控制之循环
linux·运维·shell
cui_ruicheng1 小时前
Linux网络编程(二):网络数据传输基本流程
linux·服务器·网络
怀旧,2 小时前
【Linux网络编程】15. Reactor 反应堆模式
linux·网络·php
jiayong232 小时前
Memory 写入、检索与纠错机制:让 Agent 记住,也让它忘对
java·服务器·网络·hermes
小赵不会秃头2 小时前
数据结构Day 06:线性结构、库操作及 Makefile 完整学习笔记
java·linux·数据结构·算法·面试
雨田大大2 小时前
Windows11下IDEA运行后端时,端口被占用的解决方法
linux·运维·服务器
IKun-bug2 小时前
CentOS 7 安装 Claude Code 指南
linux·运维·centos
上海云盾-小余2 小时前
服务器入侵应急处置:痕迹清理、漏洞封堵与事后加固全流程
运维·服务器
kdxiaojie2 小时前
U-Boot分析【学习笔记】(8)
linux·笔记·学习