linux分析工具之lsof详解
一、概述
在linux中,所有东西都是以文件的形式存在的,所以我们在linux上的操作都是通过对文件的操作来执行我们所需要的逻辑,比如我们对文件数据的访问,修改,访问网络的连接等,刚好lsof(list open file)命令用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
安装命令:yum install lsof #centos系统
二、语法和内容含义
2.1、使用语法
语法:lsof [options] filename
常用选项:
无选项 #默认列出所有打开的文件相关信息
file #列出打开文件存在的进程
-a #使用AND逻辑,合并选项输出内容
-c<进程名> #列出指定进程所打开的文件
-g #列出GID号进程详情
-d<文件号> #列出占用该文件描述符的进程
+d<目录> #列出目录下被打开的文件
+D<目录> #递归列出目录下被打开的文件
-n<目录> #列出使用NFS的文件
-i<条件> #列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> #列出指定进程号所打开的文件
-u #列出UID号进程详情
-U #获取 UNIX 套接口地址
-t #列出进程
-h #显示帮助信息
-v #显示版本信息
2.2、内容含义
首先我们使用lsof | head 命令查看一下
[root@lgh ~]# lsof | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init root cwd DIR , /
init root rtd DIR , /
init root txt REG , /sbin/init
init root mem REG , /lib64/libnss_files-2.12.so
init root DEL REG , /lib64/libc-2.12.so
init root DEL REG , /lib64/libgcc_s-4.4.-.so..#prelink#.AXbpAw
init root DEL REG , /lib64/librt-2.12.so
init root DEL REG , /lib64/libpthread-2.12.so.#prelink#.6p24pv
init root DEL REG , /lib64/libdbus-.so.3.4..#prelink#.M6wKKU
lsof -R +d /dev | head 命令查看一波(主要看FD这列),并且相比上面增加了PPID列
[root@mwpl003 ~]# lsof -R +d /dev | head
COMMAND PID PPID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init root 0u CHR , 0t0 /dev/null
init root 1u CHR , 0t0 /dev/null
init root 2u CHR , 0t0 /dev/null
udevd root 0u CHR , 0t0 /dev/null
udevd root 1u CHR , 0t0 /dev/null
udevd root 2u CHR , 0t0 /dev/null
rserver rstudio-server 0u CHR , 0t0 /dev/null
rserver rstudio-server 1u CHR , 0t0 /dev/null
rserver rstudio-server 2u CHR , 0t0 /dev/null
每列的基本含义如下:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE/OFF:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
其中FD文件描述符列表如下:
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX);
er:FD information error (see NAME column);
jld:jail directory (FreeBSD);
ltx:shared library text (code and data);
mxx :hex memory-mapped type number xx.
m86:DOS Merge mapped file;
mem:memory-mapped file;
mmap:memory-mapped device;
pd:parent directory;
rtd:root directory;
tr:kernel trace file (OpenBSD);
v86 VP/ix mapped file;
:表示标准输出
:表示标准输入
:表示标准错误 一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。
其中TYPE文件类型列表如下:
DIR:表示目录
CHR:表示字符类型
BLK:块设备类型
UNIX:UNIX域套接字
FIFO:先进先出(FIFO)队列
IPv4:网际协议(IP)套接字
三、实践
1、lsof -a -u root -d 2 | head #列出是root用户,并且DF为2的文件,-a只有两者满足都满足要求才列出
[root@lgh ~]# lsof -a -u root -d | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init root 2u CHR , 0t0 /dev/null
udevd root 2u CHR , 0t0 /dev/null
auditd root 2u CHR , 0t0 /dev/null
rsyslogd root 2w REG , /var/log/messages
irqbalanc root 2u CHR , 0t0 /dev/null
cupsd root 2w CHR , 0t0 /dev/null
acpid root 2u CHR , 0t0 /dev/null
hald-runn root 2u CHR , 0t0 /dev/null
hald-addo root 2u CHR , 0t0 /dev/null
2、lsof +d /bin/ #显示/bin当前目录下所有打开的文件,如果是想递归的打开则使用选项 +D即可
[root@lgh ~]# lsof +d /bin/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem dbus txt REG , /bin/dbus-daemon
bash root txt REG , /bin/bash
dbus-daem gdm txt REG , /bin/dbus-daemon
bash root txt REG , /bin/bash
3、lsof -i | head -20 | tail #使用 -i 选项显示网络连接
[root@lgh ~]# lsof -i | head - | tail
rpcbind rpc 8u IPv4 0t0 TCP *:sunrpc (LISTEN)
rpcbind rpc 9u IPv6 0t0 UDP *:sunrpc
rpcbind rpc 10u IPv6 0t0 UDP *:
rpcbind rpc 11u IPv6 0t0 TCP *:sunrpc (LISTEN)
rpc.statd rpcuser 5r IPv4 0t0 UDP localhost.localdomain:
rpc.statd rpcuser 8u IPv4 0t0 UDP *:
rpc.statd rpcuser 9u IPv4 0t0 TCP *: (LISTEN)
rpc.statd rpcuser 10u IPv6 0t0 UDP *:
rpc.statd rpcuser 11u IPv6 0t0 TCP *: (LISTEN)
cupsd root 6u IPv6 0t0 TCP localhost.localdomain:ipp (LISTEN)
4、lsof -i 4 | head #仅获取IPV4的流量 ,如果想获取IPV6的流量的话,把4改成6即可
[root@lgh ~]# lsof -i | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy root 0u IPv4 0t0 UDP *:
haproxy root 4u IPv4 0t0 TCP *:ff-fms (LISTEN)
haproxy root 5u IPv4 0t0 TCP *:panagolin-ident (LISTEN)
haproxy root 6u IPv4 0t0 TCP *:scp-config (LISTEN)
rserver rstudio-server 6u IPv4 0t0 TCP *:msgsrvr (LISTEN)
rsyslogd root 4u IPv4 0t0 UDP *:syslog
rpcbind rpc 6u IPv4 0t0 UDP *:sunrpc
rpcbind rpc 7u IPv4 0t0 UDP *:
rpcbind rpc 8u IPv4 0t0 TCP *:sunrpc (LISTEN)
5、lsof -itcp |head #显示所有tcp连接,如果想显示udp连接就把tcp改成udp即可
[root@lgh~]# lsof -itcp |head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy root 4u IPv4 0t0 TCP *:ff-fms (LISTEN)
haproxy root 5u IPv4 0t0 TCP *:panagolin-ident (LISTEN)
haproxy root 6u IPv4 0t0 TCP *:scp-config (LISTEN)
rserver rstudio-server 6u IPv4 0t0 TCP *:msgsrvr (LISTEN)
rpcbind rpc 8u IPv4 0t0 TCP *:sunrpc (LISTEN)
rpcbind rpc 11u IPv6 0t0 TCP *:sunrpc (LISTEN)
rpc.statd rpcuser 9u IPv4 0t0 TCP *: (LISTEN)
rpc.statd rpcuser 11u IPv6 0t0 TCP *: (LISTEN)
cupsd root 6u IPv6 0t0 TCP localhost.localdomain:ipp (LISTEN)
6、lsof -i@192.168.88.133 #使用-i@host显示该主机是否连接了指定主机,使用-i@host:port显示该主机是否通过某个指定端口连接指定主机
[root@lgh ~]# lsof -i@192.168.88.133
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java zookeeper 31u IPv4 0t0 TCP lgh:macbak->lgh1: (ESTABLISHED)
java zookeeper 33u IPv4 0t0 TCP lgh:->lgh1:bmcpatrolagent (ESTABLISHED)
java zookeeper 46u IPv4 0t0 TCP lgh:eforward->lgh1: (ESTABLISHED)
catalogd impala 277u IPv4 0t0 TCP lgh:->lgh1:med-ltp (ESTABLISHED)
catalogd impala 278u IPv6 0t0 TCP lgh:->lgh1: (ESTABLISHED)
catalogd impala 279u IPv6 0t0 TCP lgh:->lgh1: (ESTABLISHED)
You have mail in /var/spool/mail/root
[root@lgh ~]# lsof -i@192.168.88.133:60670
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java zookeeper 31u IPv4 0t0 TCP lgh:macbak->lgh1: (ESTABLISHED)
7、lsof -i -stcp:LISTEN |head #找出所有监听的文件,把LISTEN换成ESTABLISHED表示显示所有建立连接的文件
[root@lgh ~]# lsof -i -stcp:LISTEN |head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy root 4u IPv4 0t0 TCP *:ff-fms (LISTEN)
haproxy root 5u IPv4 0t0 TCP *:panagolin-ident (LISTEN)
haproxy root 6u IPv4 0t0 TCP *:scp-config (LISTEN)
rserver rstudio-server 6u IPv4 0t0 TCP *:msgsrvr (LISTEN)
rpcbind rpc 8u IPv4 0t0 TCP *:sunrpc (LISTEN)
rpcbind rpc 11u IPv6 0t0 TCP *:sunrpc (LISTEN)
rpc.statd rpcuser 9u IPv4 0t0 TCP *: (LISTEN)
rpc.statd rpcuser 11u IPv6 0t0 TCP *: (LISTEN)
cupsd root 6u IPv6 0t0 TCP localhost.localdomain:ipp (LISTEN)
8、lsof -u root | head #指定root用户打开的所有文件,可以通过 -u ^root取反,表示非root用户打开的文件,kill -9 `lsof -u hive -t` 表示杀掉hive所有的进程
[root@lgh ~]# lsof -u root | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init root cwd DIR , /
init root rtd DIR , /
init root txt REG , /sbin/init
init root mem REG , /lib64/libnss_files-2.12.so
init root DEL REG , /lib64/libc-2.12.so
init root DEL REG , /lib64/libgcc_s-4.4.-.so..#prelink#.AXbpAw
9、 lsof -c haproxy #显示指定haproxy命令的连接文件,使用-p参数则是指定端口
[root@lgh ~]# lsof -c haproxy
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy root cwd DIR , /data/hive/transfer_baseinfo
haproxy root rtd DIR , /
haproxy root txt REG , /usr/local/sbin/haproxy
haproxy root DEL REG , /lib64/libc-2.12.so
haproxy root DEL REG , /lib64/ld-2.12.so
haproxy root 0u IPv4 0t0 UDP *:
haproxy root 3u unix 0xffff88204e2343c0 0t0 /var/run/haproxy/info.sock..tmp
haproxy root 4u IPv4 0t0 TCP *:ff-fms (LISTEN)
四、数据恢复
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。
lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容
我们使用 /var/log/messages做测试:
首先我们用lsof查看下/var/log/messages这个文件的连接
[root@lgh2 fd]# lsof | grep messages
rsyslogd root 6w REG , /var/log/messages
in:imjour root 6w REG , /var/log/messages
rs:main root 6w REG , /var/log/messages
然后我们使用命令rm -f /var/log/messages删除文件,继续使用lsof命令查看,已经显示删除
[root@lgh2 fd]# lsof | grep messages
rsyslogd root 6w REG , /var/log/messages (deleted)
in:imjour root 6w REG , /var/log/messages (deleted)
rs:main root 6w REG , /var/log/messages (deleted)
然后我们cd /proc/6511/fd #6511表示进程号,然后我们ll查看一下目录
[root@lgh2 fd]# ll
total
lr-x------ root root Oct : -> /dev/null
l-wx------ root root Oct : -> /dev/null
l-wx------ root root Oct : -> /dev/null
lr-x------ root root Oct : -> anon_inode:inotify
lrwx------ root root Oct : -> socket:[]
lr-x------ root root Oct : -> /run/log/journal/0b933fe64005419d8f16599287df47be/system.journal
l-wx------ 1 root root 64 Oct 12 04:22 6 -> /var/log/messages (deleted) #这里发现6这个文件描述符指向这个文件/var/log/messages
我们cat查看一下6这个文件
[root@lgh2 fd]# cat | head -20 #这个文件就是我们对应的/var/log/messages文件
Sep :: lgh2 chronyd[]: Selected source 120.25.115.20
Sep :: lgh2 chronyd[]: System clock wrong by -43210.956291 seconds, adjustment started
Sep :: lgh2 systemd: Started Session of user root.
Sep :: lgh2 systemd: Time has been changed
Sep :: lgh2 chronyd[]: Forward time jump detected!
Sep :: lgh2 chronyd[]: Can't synchronise: no selectable sources
Sep :: lgh2 chronyd[]: Selected source 119.28.183.184
Sep :: lgh2 chronyd[]: System clock wrong by -43211.807006 seconds, adjustment started
Sep :: lgh2 chronyd[]: Selected source 120.25.115.20
Sep :: lgh2 chronyd[]: Selected source 119.28.183.184
Sep :: lgh2 systemd: Started Session of user root.
Sep :: lgh2 systemd: Started Session of user root.
Sep :: lgh2 systemd: Time has been changed
Sep :: lgh2 chronyd[]: Forward time jump detected!
Sep :: lgh2 chronyd[]: Can't synchronise: no selectable sources
Sep :: lgh2 chronyd[]: Selected source 5.79.108.34
Sep :: lgh2 chronyd[]: System clock wrong by -43211.562700 seconds, adjustment started
Sep :: lgh2 chronyd[]: Selected source 120.25.115.20
Sep :: lgh2 systemd: Started Session of user root.
Sep :: lgh2 systemd: Time has been changed
然后我们使用命令 cat /proc/6511/fd/6 > /var/log/messages 还原数据,然后我们继续使用lsof命令查看
[root@lgh2 fd]# lsof | grep messages
rsyslogd root 6w REG , /var/log/messages
in:imjour root 6w REG , /var/log/messages
rs:main root 6w REG , /var/log/messages
还原成功了
更多linux文章请见:linux&shell学习系列
linux分析工具之lsof详解的更多相关文章
- linux分析工具之vmstat详解
一.概述 vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.首先我们查看下帮助.如下图所 ...
- 日志分析工具ELK配置详解
日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...
- Linux性能分析工具top命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. top命令说明 [www.linuxidc.com@linuxidc-t-tomcat-1 ...
- 黑苹果引导工具 Clover 配置详解及Clover Configurator使用
黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可 ...
- Linux文件系统的目录结构详解
Linux文件系统的目录结构详解 一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- virtualbox centos安装增强工具和问题详解
virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
- linux PHP 编译安装参数详解
linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
随机推荐
- CodeForces 628 D Magic Numbers 数位DP
Magic Numbers 题意: 题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d. 然后求[L, R]里面的多少个数是d-串,且是m的倍数. ...
- Codeforces 734C. Anton and Making Potions(二分)
Anton is playing a very interesting computer game, but now he is stuck at one of the levels. To pass ...
- codeforces 805 E. Ice cream coloring(dfs)
题目链接:http://codeforces.com/contest/805/problem/E 题意:你有n个节点,这个n个节点构成一棵树.每个节点拥有有si个类型的ice,同一个节点的ice互相连 ...
- abp(net core)+easyui+efcore实现仓储管理系统——菜单-下(十七)
实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案 ...
- Java开发必备工具 ------------工欲善其事,必先利其器
java企业级开发基本工具 一.开发必备工具 1.Java开发环境 JDK (官网下载即可,需要注册账户) JRE 2.Java企业编码开发工具 IntelliJ IDEA(建议使用Idea,插件使用 ...
- Salesforce LWC学习(六) @salesforce & lightning/ui*Api Reference
上一篇中我们在demo中使用了很多的 @salesforce 以及 lightning/ui*Api的方法,但是很多没有细节的展开.其实LWC中针对这些module提供了很多好用的方法,下面对这两种进 ...
- 从原理层面掌握@InitBinder的使用【享学Spring MVC】
每篇一句 大魔王张怡宁:女儿,这堆金牌你拿去玩吧,但我的银牌不能给你玩.你要想玩银牌就去找你王浩叔叔吧,他那银牌多 前言 为了讲述好Spring MVC最为复杂的数据绑定这块,我前面可谓是做足了功课, ...
- 数论 Day 13
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- 024 实例5-身体质量指数BMI
目录 一."身体质量指数BMI"问题分析 1.1 身体质量指数BMI 1.2 问题需求 二."身体质量指数BMI"实例讲解 2.1 身体质量指标BMI 2.1. ...
- BigDecimal转String
代码: public static void main(String[] args) { // 浮点数的打印 System.out.println(new BigDecimal("10000 ...