linux基本功系列之lsof命令实战

news2024/11/29 8:37:08

![在这里插入图片描述](https://img-blog.csdnimg.cn/070c6fa5bad74451b93d815af234e6ea.png#

文章目录

  • 前言
  • 一. lsof命令介绍
  • 二. 语法格式及常用选项
  • 三. 参考案例
    • 3.1 显示系统打开的文件
    • 3.2 查找某个文件相关的进程
    • 3.3 列出某个用户打开的文件信息
    • 3.4 列出某个程序进程所打开的文件信息
    • 3.5 查看某个进程号打开的文件
    • 3.6 列出所有的网络连接
    • 3.7 列出谁在使用某个端口
    • 3.8 恢复误删除的文件
  • 总结

前言

大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第45篇文章。

专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。

如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

一. lsof命令介绍

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP),是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

lsof 查看的文件可以是:

  • 普通文件
  • 目录
  • 字符或块设备文件
  • 共享库
  • 管道、命名管道
  • 符号链接
  • 网络文件(如 NFS file、网络 socket,Unix 域名 socket)
  • 其它类型的文件,等等

二. 语法格式及常用选项

常用的命令选项如下表:

参数描述
-a列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u列出UID号进程详情
-h显示帮助信息
-v显示版本信息

三. 参考案例

3.1 显示系统打开的文件

也就是查找谁在使用文件系统:

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

[root@mufenggrow ~]# lsof |head -5
COMMAND     PID   TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                 root  cwd       DIR              253,0       224         64 /
systemd       1                 root  rtd       DIR              253,0       224         64 /
systemd       1                 root  txt       REG              253,0   1616360   17335469 /usr/lib/systemd/systemd
systemd       1                 root  mem       REG              253,0     20112     171185 /usr/lib64/libuuid.so.1.3.0
[root@mufenggrow ~]# 

输出的内容,第一行的参数解释:

参数描述
COMMAND:进程的名称
PID进程标识符
USER进程所有者
FD文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE文件类型,如DIR、REG等
DEVICE指定磁盘的名称
SIZE文件的大小
NODE索引节点(文件在磁盘上的标识)
NAME打开文件的确切名称

关于FD列的介绍:

FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上面代码中显示的 /usr/lib/systemd/systemd程序

其他常用的参数如下表:

参数描述
cwd表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnnlibrary references (AIX);
erFD information error (see NAME column);
jldjail directory (FreeBSD);
ltxshared library text (code and data);
memmemory-mapped file;
mmapmemory-mapped device;
pdparent directory;
rtdroot directory;
trkernel trace file (OpenBSD);
0表示标准输出
1表示标准输入
2表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等

(1)u:表示该文件被打开并处于读取/写入模式

(2)r:表示该文件被打开并处于只读模式

(3)w:表示该文件被打开并处于

(4)空格:表示该文件的状态模式为unknow,且没有锁定

(5)-:表示该文件的状态模式为unknow,且被锁定

关于Type 列的介绍:

缩写含义
DIR表示目录
CHR表示字符类型
BLK块设备类型
UNIX UNIX 域套接字
FIFO先进先出 (FIFO) 队列
IPv4网际协议 (IP) 套接字

3.2 查找某个文件相关的进程

查找某个文件相关的进程,换句话说就是查看谁在使用某个文件

[root@mufenggrow ~]# lsof /bin/bash
COMMAND    PID USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
ksmtuned  6230 root txt    REG  253,0   964608 50423603 /usr/bin/bash
bash     19925 root txt    REG  253,0   964608 50423603 /usr/bin/bash
bash     20483 root txt    REG  253,0   964608 50423603 /usr/bin/bash
bash     21114 root txt    REG  253,0   964608 50423603 /usr/bin/bash

可以看到PID,进程号,和某个命令command

3.3 列出某个用户打开的文件信息

创建一个mufeng用户,然后使用lsof -u 进行查看,mufeng用户打开的文件信息

[root@mufenggrow ~]# useradd mufeng
[root@mufenggrow ~]# echo 123456 |passwd --stdin mufeng
更改用户 mufeng 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@mufenggrow ~]# su - mufeng
[mufeng@mufenggrow ~]$ vim a.txt

查看mufeng用户打开的文件信息:

[root@mufenggrow ~]# lsof -u mufeng
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
bash    73251 mufeng  cwd    DIR  253,0       139 33788283 /home/mufeng
bash    73251 mufeng  rtd    DIR  253,0       224       64 /
bash    73251 mufeng  txt    REG  253,0    964608 50423603 /usr/bin/bash

如果我们创建好用户但是不登录:

[root@mufenggrow ~]# useradd mufenggrow
[root@mufenggrow ~]# lsof -u mufenggrow

可以看到如果不登录,查看不到任何信息。

如果不想显示某个用户打开的进程,可以使用^

lsof -u ^root 表示不查看root用户打开的进程,换句话说就是root用户打开的进程不显示。

3.4 列出某个程序进程所打开的文件信息

比如我们查看MySQL进程,使用-C 参数, -c 选项将会列出所有以mysql这个进程开头的程序的文件

[root@mufenggrow ~]# yum install mariadb -y
## 此时没有启动进程,可以发现未输出任何内容
[root@mufenggrow ~]# lsof -c mysql
#启动MySQL
[root@mufenggrow ~]# systemctl  restart mariadb
[root@mufenggrow ~]# lsof -c mysql
COMMAND     PID  USER   FD   TYPE             DEVICE  SIZE/OFF     NODE NAME
mysqld_sa 73597 mysql  cwd    DIR              253,0       224       64 /
mysqld_sa 73597 mysql  rtd    DIR              253,0       224       64 /
mysqld_sa 73597 mysql  txt    REG              253,0    964608 50423603 

如果想看多个进程打开的多个文件,可以加多个-c参数。

比如:

lsof -c mysql -c apache

3.5 查看某个进程号打开的文件

这里用到-p参数,查看进程号为1的进程号打开的文件

[root@mufenggrow ~]# lsof -p 1
COMMAND PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd   1 root  cwd       DIR              253,0      224         64 /
systemd   1 root  rtd       DIR              253,0      224         64 /

如果要查看多个进程号对应的文件:

lsof -p 1,2,3

3.6 列出所有的网络连接

在这里我们可以使用 -i 列出网络连接

-i tcp 表示列出所有tcp相关的网络连接信息
-i upd 表示列出所有UDP相关的网络连接信息

[root@mufenggrow ~]# lsof -i udp
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd       1   root   87u  IPv4  33667      0t0  UDP *:sunrpc 
systemd       1   root  146u  IPv6  33669      0t0  UDP *:sunrpc 
rpcbind    6105    rpc    5u  IPv4  33667      0t0  UDP *:sunrpc 
rpcbind    6105    rpc    7u  IPv6  33669      0t0  UDP *:sunrpc 
rpcbind    6105    rpc   10u  IPv4  34871      0t0  UDP *:rxe 
rpcbind    6105    rpc   11u  IPv6  34872      0t0  UDP *:rxe 
avahi-dae  6158  avahi   12u  IPv4  37772      0t0  UDP *:mdns 
avahi-dae  6158  avahi   13u  IPv4  37773      0t0  UDP *:58076 
chronyd    6176 chrony    1u  IPv4  38347      0t0  UDP localhost:323 
chronyd    6176 chrony    2u  IPv6  38348      0t0  UDP localhost:323 
dnsmasq    7293 nobody    3u  IPv4  46027      0t0  UDP *:bootps 
dnsmasq    7293 nobody    5u  IPv4  46030      0t0  UDP mufenggrow:domain 
dhclient  21569   root    6u  IPv4  93194      0t0  UDP *:bootpc 

3.7 列出谁在使用某个端口

此时也是用 -i参数

[root@mufenggrow ~]# lsof -i :3306
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  73762 mysql   14u  IPv4 169606      0t0  TCP *:mysql (LISTEN)

我们遇到端口冲突的时候,可以使用lsof查看端口是否被占用。

3.8 恢复误删除的文件

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。

有时候管理错误也可能导致意外删除某些重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。
这时候可以尝试使用lsof来恢复:

使用lsof 恢复文件的原理:

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。

这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

在/proc 目录下,其中包含了反映内核和进程树的各种文件,/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在磁盘中,当我们写入和读取信息的时候,实际是从内存中获取相关的信息。

我们来看看恢复过程,实验过程如下:

  1. 创建一个目录并创建一个文件
  2. 在另一个窗口打开这个文件,并保持一直打开的状态,比如使用vim命令
  3. 在第一个创建删掉文件
  4. 使用lsof进行恢复
# 创建文件
[root@mufenggrow ~]# mkdir test
[root@mufenggrow ~]# cd test/
# 拷贝一份文件过来
[root@mufenggrow test]# cp /etc/passwd ./

#在另一个窗口使用vim打开文件
# [root@mufenggrow ~]# vim passwd 
# 删除文件
[root@mufenggrow test]# rm -rf passwd 
# 用lsof来查看当前是否有进程打开passwd文件
[root@mufenggrow test]# lsof |grep passwd
cupsd      6850                 root   10r      REG              253,0      2323   17951309 /etc/passwd+ (deleted)
vim       74174                 root    4u      REG              253,0     12288   33994260 /root/.passwd.swp

# 这里我们发现PID6850 打开文件的文件描述符为10, 另外在passwd后面看到delete字样。
接下来我们打开文件描述符为10的文件:

[root@mufenggrow test]# head -n 10 /proc/6850/fd/10
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@mufenggrow test]# ls
#通过上面的命令我们可以确认,这个描述符为10的文件就是我们要恢复的文件
使用重定向进行文件恢复
[root@mufenggrow test]# cat /proc/6850/fd/10 > passwd
# 查看是否执行成功

[root@mufenggrow test]# cat passwd |head 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@mufenggrow test]# 

我们通过上面的案例可以看到,已经恢复成功了,这里的前提就是,被删除的文件一定要有进程在使用。

总结

以上就是关于lsof命令的全部内容了,喜欢的小伙伴,一键三连哦。

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

请添加图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSS(Object Storage Service)进行上传图片,下载图片(详细看文档可以完成操作)

文章目录1.单体前后端项目上传1.上传流程2. BuckName 和EndPoint3. AccessKey 和Access Secret(创建RAM&#xff08;Resource Access Manage&#xff09;的子账号&#xff0c;然后可以获得Accesskey和Acess Secret)3.根据创建的子账号分配OSS的所有权限(可以对文件进行上传&…

【年度总结】回望大学四年坎坷的2022

【年度总结】回望大学四年&坎坷的2022 2022年&#xff0c;我毕业了&#xff01; 满心欢喜的离开&#xff0c;到现在看来&#xff0c;却甚是想念大学的时光。 这一年&#xff0c;绝对是我此生过的最难的一年。考研失利、工作不顺、投资失败、“财政”赤字...... 现在的我…

浅析依赖注入框架的生命周期(以 InversifyJS 为例)

在上一篇介绍了 VSCode 的依赖注入设计&#xff0c;并且实现了一个简单的 IOC 框架。但是距离成为一个生产环境可用的框架还差的很远。 行业内已经有许多非常优秀的开源 IOC 框架&#xff0c;它们划分了更为清晰地模块来应对复杂情况下依赖注入运行的正确性。 这里我将以 Inv…

RiproV2主题首页中间网站动态栏美化教程

优化描述 Riprov2官网首页如下: 中间部分网站动态条过于简单,想优化成本文后续的样子,本教程解决这个问题。 优化后可设置滚动,可显示会员总数,今日发布,本周发布,资源总数等项。 优化后的具体网站:

大白话说ChatGPT

ChatGPT是如何流行的&#xff1f; 在经历了2016年&#xff0c;由AlphGo击败李世石而掀起的AI浪潮后&#xff0c;AI行业沉寂良久&#xff0c;上一波浪潮里起来的AI算法公司&#xff0c;在硬件化和数据的泥沼里寻找出路&#xff0c;这么多年&#xff0c;AI行业太需要一个现象级的…

JVM从跨平台到跨专业 Ⅲ -- 类加载与字节码技术【下】

文章目录编译期处理默认构造器自动拆装箱泛型集合取值可变参数foreach 循环switch 字符串switch 枚举枚举类try-with-resources方法重写时的桥接方法匿名内部类类加载阶段加载链接初始化相关练习和应用类加载器类与类加载器启动类加载器拓展类加载器双亲委派模式自定义类加载器…

前端JavaScript获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…

NLP顶会近三年小众研究领域

ACL 2022 编码器和解码器框架、自然语言生成、知识i神经元、抽取式文本摘要、预训练语言模型、零样本神经机器翻译等。 2021 新闻标题生成任务等。跨语言命名实体识别、代码搜索、音乐生成、Hi-Transformer、预训练语言模型、语义交互等。 EMNLP 2021 代码摘要生成、隐私…

MyBatis 单表的增删改查

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

在多线程环境下使用哈希表

一.HashTable和HashMapHashTable是JDK1.0时创建的&#xff0c;其在创建时考虑到了多线程情况下存在的线程安全问题&#xff0c;但是其解决线程安全问题的思路也相对简单&#xff1a;在其众多实现方法上加上synchronized关键字&#xff08;效率较低&#xff09;&#xff0c;保证…

《SOC芯片研究框架》深度科普,发展趋势、技术特点、产业链一文看懂

片上系统SoC&#xff08;System on Chip&#xff09;&#xff0c;即在一块芯片上集成一整个信息处理系统&#xff0c;简单来说 SoC芯片是在中央处理器CPU的基础上扩展音视频功能和专用接口的超大规模集成电路&#xff0c;是智能设备的“大脑”。随着半导体工艺的发展&#xff0…

Typescript - interface 关键字(通俗易懂的详细教程)

前言 简单来说&#xff0c;Interface 就是一种描述对象或函数的东西。 您可以把 interface 理解为形状&#xff0c;真实开发情况下&#xff0c;一个对象需要有什么样的属性&#xff0c;函数需要什么参数或返回什么样的值&#xff0c;数组应该是什么样子的&#xff0c;一个类和继…

MySQL慢查询分析和性能优化

1 背景我们的业务服务随着功能规模扩大&#xff0c;用户量扩增&#xff0c;流量的不断的增长&#xff0c;经常会遇到一个问题&#xff0c;就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多&#xff0c;而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…

矢量网络分析仪介绍

矢量网络分析仪VNA是一种测试仪器&#xff0c;它可以将网络的响应测量成矢量:实参数和虚参数&#xff0c;从而表征其性能。矢量网络分析仪VNA是射频设计实验室和许多制造和服务领域的重要测试仪器。虽然矢量网络分析仪主要侧重于研究和开发&#xff0c;但它也可以为所有类型的R…

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形前言一. 柱状图中最大的矩形前言 想要精通算法和SQL的成长之路 - 系列导航 一. 柱状图中最大的矩形 原题链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求…

你是真的“C”——操作符详解【下篇】+整形提升+算术转换

你是真的“C”——操作符详解下篇&#x1f60e;前言&#x1f64c;操作符详解【上篇】内容&#xff1a;操作符详解【下篇】内容&#xff1a;1、 条件操作符2、逗号表达式&#xff1a;3、下标引用、函数调用和结构成员3、访问一个结构的成员表达式求值1、隐式类型转换&#xff1a…

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…

Imported target “dart“ includes non-existent path 笔记

详细问题&#xff1a;关联功能包&#xff0c;源码编译Failed <<< gazebo_ros2_control [11.8s, exited with code 1]网上查了很多资料&#xff0c;都是比较旧版&#xff0c;这里注意由于ROS2系统发展很快&#xff0c;功能包在快速集成。使用源码编译可能会遇到环境配置…

PMP报考条件?

PMP已经被认为是项目管理专业身份的象征&#xff0c;项目经理人取得的重要资质。 PMP考试一般每年在中国大陆地区&#xff0c;会进行四次考试&#xff0c;今天就来详细说一说PMP考试的时间线。 01考试时间PMP考试在中国大陆一年开展四次&#xff0c;分别在每年的3月、6月、9月…

SpringCloud(17):Sentinel简介

1 流量控制&熔断降级介绍 1.1 流量控制简介 拿旅游景点举个示例&#xff0c;每个旅游景点通常都会有最大的接待量&#xff0c;不可能无限制的放游客进入&#xff0c;比如故宫每天只卖八万张票&#xff0c;超过八万的游客&#xff0c;无法买票进入&#xff0c;因为如果超过…