Linux lsof命令详解

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

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件(lsof强大原因)。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因 为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 

选项

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

实例

 1 lsof
 2 command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
 3 init          1 root  cwd       DIR                8,2     4096          2 /
 4 init          1 root  rtd       DIR                8,2     4096          2 /
 5 init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
 6 init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
 7 init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
 8 init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
 9 init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
10 init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
11 init          1 root   10u     FIFO               0,17                1233 /dev/initctl
12 migration     2 root  cwd       DIR                8,2     4096          2 /
13 migration     2 root  rtd       DIR                8,2     4096          2 /
14 migration     2 root  txt   unknown                                        /proc/2/exe
15 ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
16 ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
17 ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
18 migration     4 root  cwd       DIR                8,2     4096          2 /
19 migration     4 root  rtd       DIR                8,2     4096          2 /
20 migration     4 root  txt   unknown                                        /proc/4/exe
21 ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
22 ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
23 ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
24 events/0      6 root  cwd       DIR                8,2     4096          2 /
25 events/0      6 root  rtd       DIR                8,2     4096          2 /
26 events/0      6 root  txt   unknown                                        /proc/6/exe
27 events/1      7 root  cwd       DIR                8,2     4096          2 /

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:  
COMMAND:进程的名称 
PID:进程标识符 
USER:进程所有者 
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 
TYPE:文件类型,如DIR、REG等 
DEVICE:指定磁盘的名称 
SIZE:文件的大小 
NODE:索引节点(文件在磁盘上的标识) 
NAME:打开文件的确切名称 
其中FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读(R) 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,0、1、2, 分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。  
Type : 文件和目录分别称为 REG 和 DIR(在 Solaris 中,称为 VREG 和 VDIR)。而CHR 和 BLK,分别表示字符和块设备; 或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

 1 文件描述符列表:
 2 
 3 cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
 4 txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
 5 lnn:library references (AIX);
 6 er:FD information error (see NAME column);
 7 jld:jail directory (FreeBSD);
 8 ltx:shared library text (code and data);
 9 mxx :hex memory-mapped type number xx.
10 m86:DOS Merge mapped file;
11 mem:memory-mapped file;
12 mmap:memory-mapped device;
13 pd:parent directory;
14 rtd:root directory;
15 tr:kernel trace file (OpenBSD);
16 v86  VP/ix mapped file;
17 0:表示标准输出
18 1:表示标准输入
19 2:表示标准错误
20 
21 一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
22 
23 u:表示该文件被打开并处于读取/写入模式。
24 r:表示该文件被打开并处于只读模式。
25 w:表示该文件被打开并处于。
26 空格:表示该文件的状态模式为unknow,且没有锁定。
27 -:表示该文件的状态模式为unknow,且被锁定。
28 
29 同时在文件状态模式后面,还跟着相关的锁:
30 
31 N:for a Solaris NFS lock of unknown type;
32 r:for read lock on part of the file;
33 R:for a read lock on the entire file;
34 wfor a write lock on part of the file;(文件的部分写锁)
35 W:for a write lock on the entire file;(整个文件的写锁)
36 u:for a read and write lock of any length;
37 U:for a lock of unknown type;
38 x:for an SCO OpenServer Xenix lock on part      of the file;
39 X:for an SCO OpenServer Xenix lock on the      entire file;
40 space:if there is no lock.
 1 文件类型:
 2 
 3 DIR:表示目录。
 4 CHR:表示字符类型。
 5 BLK:块设备类型。
 6 UNIX: UNIX 域套接字。
 7 FIFO:先进先出 (FIFO) 队列。
 8 IPv4:网际协议 (IP) 套接字。
 9 DEVICE:指定磁盘的名称
10 SIZE:文件的大小
11 NODE:索引节点(文件在磁盘上的标识)
12 NAME:打开文件的确切名称

常用参数

lsof语法格式是:
lsof [options] filename

 1 lsof abc.txt 显示开启文件abc.txt的进程
 2 lsof -c abc 显示出以字母 abc 开头进程现在打开的文件
 3 lsof -p 1234 列出进程号为1234的进程所打开的文件
 4 lsof -g gname/gid 显示归属gname或gid的进程情况
 5 lsof -u uname/uid 显示归属uname或uid的进程情况
 6 lsof +d /usr/local/ 显示目录下被进程开启的文件
 7 lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
 8 lsof -d 4 显示使用fd为4的进程
 9 lsof -i 用以显示符合条件的进程情况
10 lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
11   46 --> IPv4 or IPv6
12   protocol --> TCP or UDP
13   hostname --> Internet host name
14   hostaddr --> IPv4地址
15   service --> /etc/service中的 service name (可以不止一个)
16   port --> 端口号 (可以不止一个)

实例

复制代码
lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof /dev/cdrom //那个进程在占用光驱
lsof -c sendmail //查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -utony //查看用户tony的进程的文件使用情况
lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i:80 //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
复制代码

查看打开22端口的所有进程

# lsof -i :22 
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME 
sshd    1409 root    3u  IPv6   5678       TCP *:ssh (LISTEN)  

查看所属root用户进程所打开的文件类型为txt的文件

复制代码
# lsof -a -u root -d txt 
COMMAND    PID USER  FD      TYPE DEVICE    SIZE    NODE NAME 
init       1    root txt       REG    3,3   38432 1763452 /sbin/init 
mingetty  1632 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1633 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1634 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1635 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1636 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1637 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
kdm        1638 root txt       REG    3,3  132548 1428194 /usr/bin/kdm 
X          1670 root txt       REG    3,3 1716396 1428336 /usr/bin/Xorg 
kdm        1671 root txt       REG    3,3  132548 1428194 /usr/bin/kdm 
startkde  2427 root txt       REG    3,3  645408 1544195 /bin/bash  
复制代码

查看某个进程使用某个文件描述符的情况

#lsof -d 6 |grep 6139

搜索某个地址打开的网络连接

  如果想搜索IP地址为10.645.64.23的远程连接主机的所有网络连接,可以执行如下命令,该命令可以打开系统中该远程知己所有打开的套接字。

lsof –i@10.65.64.23

寻找本地断开的打开文件

  用户经常遇到这种情况,当一个进程正在向一个文件写数据时,该文件的目录可能被移动。这就产生了一个非常大的问题。例如,用户可能发现正在向/data写数据,但是却看不到文件增大,LSOF这个工具可以找到到这样的错误。

lsof –a +L1 /data 

查找谁在使用文件系统

在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:

# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/

在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

恢复删除的文件

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)

从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

复制代码
# head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
复制代码

从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:

cat /proc/1283/fd/2 > /var/log/messages

对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

 

参考:http://blog.csdn.net/yuzhihui_no1/article/details/51767516

转载于:https://www.cnblogs.com/muchengnanfeng/p/9554993.html

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

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

相关文章

史密斯卧推:杠铃史密斯下斜卧推、上斜机卧推、平板卧推动作图解

史密斯卧推&#xff1a;杠铃史密斯下斜卧推、上斜机卧推、平板卧推动作图解 史密斯卧推&#xff08;smith press&#xff09;是固定器械上完成的卧推&#xff0c;对于初级健身者来说&#xff0c;自由卧推&#xff08;哑铃卧推、杠铃卧推&#xff09;还不能很好地把握平衡性&…

图像特征 可视化_使用卫星图像可视化建筑区域

图像特征 可视化地理可视化/菲律宾/遥感 (GEOVISUALIZATION / PHILIPPINES / REMOTE-SENSING) Big data is incredible! The way Big Data manages to bring sciences and business domains to new levels is almost sort of magical. It allows us to tap into a variety of a…

375. 猜数字大小 II

375. 猜数字大小 II 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数字比你的 更大或者更…

海量数据寻找最频繁的数据_在数据中寻找什么

海量数据寻找最频繁的数据Some activities are instinctive. A baby doesn’t need to be taught how to suckle. Most people can use an escalator, operate an elevator, and open a door instinctively. The same isn’t true of playing a guitar, driving a car, or anal…

OSChina 周四乱弹 —— 要成立复仇者联盟了,来报名

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 Devoes &#xff1a;分享吴若希的单曲《越难越爱 (Love Is Not Easy / TVB剧集《使徒行者》片尾曲)》: 《越难越爱 (Love Is No…

2023. 连接后等于目标字符串的字符串对

2023. 连接后等于目标字符串的字符串对 给你一个 数字 字符串数组 nums 和一个 数字 字符串 target &#xff0c;请你返回 nums[i] nums[j] &#xff08;两个字符串连接&#xff09;结果等于 target 的下标 (i, j) &#xff08;需满足 i ! j&#xff09;的数目。 示例 1&…

webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)

1、ajax报500,4的错误&#xff0c;然而多次验证自己的后台方法没错。然后跟踪到如下图的错误信息&#xff01; 2、因为两个函数都是无参的&#xff0c;返回值也一样。如下图 3&#xff0c;我给第一个函数加了一个参数后&#xff0c;就不报错了&#xff0c;所以我想&#xff0c;…

可视化 nlp_使用nlp可视化尤利西斯

可视化 nlpMy data science experience has, thus far, been focused on natural language processing (NLP), and the following post is neither the first nor last which will include the novel Ulysses, by James Joyce, as its primary target for NLP and literary elu…

本地搜索文件太慢怎么办?用Everything搜索秒出结果(附安装包)

每次用电脑本地的搜索都慢的一批&#xff0c;后来发现了一个搜索利器 基本上搜索任何文件都不用等待。 并且页面非常简洁&#xff0c;也没有任何广告&#xff0c;用起来非常舒服。 软件官网如下&#xff1a; voidtools 官网提供三个版本&#xff0c;用起来差别不大。 网盘链…

小程序入口传参:关于带参数的小程序扫码进入的方法

1.使用场景 1.医院场景&#xff1a;比如每个医生一个id&#xff0c;通过带参数二维码&#xff0c;扫码二维码就直接进入小程序医生页面 2.餐厅场景&#xff1a;比如每个菜一个二维码&#xff0c;通过扫码这个菜的二维码&#xff0c;进入小程序后&#xff0c;可以直接点这道菜&a…

python的power bi转换基础

I’ve been having a great time playing around with Power BI, one of the most incredible things in the tool is the array of possibilities you have to transform your data.我在玩Power BI方面玩得很开心&#xff0c;该工具中最令人难以置信的事情之一就是您必须转换数…

您是六个主要数据角色中的哪一个

When you were growing up, did you ever play the name game? The modern data organization has something similar, and it’s called the “Bad Data Blame Game.” Unlike the name game, however, the Bad Data Blame Game is played when data downtime strikes and no…

自定义按钮动态变化_新闻价值的变化定义

自定义按钮动态变化I read Bari Weiss’ resignation letter from the New York Times with some perplexity. In particular, I found her claim that she “was hired with the goal of bringing in voices that would not otherwise appear in your pages” a bit strange: …

Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)

1.TCP握手定理 2.TCP状态 l CLOSED&#xff1a;初始状态&#xff0c;表示TCP连接是“关闭着的”或“未打开的”。 l LISTEN &#xff1a;表示服务器端的某个SOCKET处于监听状态&#xff0c;可以接受客户端的连接。 l SYN_RCVD &#xff1a;表示服务器接收到了来自客户端请求…

算法 从 数中选出_算法可以选出胜出的nba幻想选秀吗

算法 从 数中选出Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without …

django-rest-framework第一次使用使用常见问题

2019独角兽企业重金招聘Python工程师标准>>> 记录在第一次使用django-rest-framework框架使用时遇到的问题&#xff0c;为了便于理解在这里创建了Person和Grade这两个model from django.db import models class Person(models.Model):SHIRT_SIZES ((S, Small),(M, …

插入脚注把脚注标注删掉_地狱司机不应该只是英国电影历史数据中的脚注,这说明了为什么...

插入脚注把脚注标注删掉Cowritten by Andie Yam由安迪(Andie Yam)撰写 Hell Drivers”, 1957地狱司机 》电影海报 Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. Mor…

贝叶斯统计 传统统计_统计贝叶斯如何补充常客

贝叶斯统计 传统统计For many years, academics have been using so-called frequentist statistics to evaluate whether experimental manipulations have significant effects.多年以来&#xff0c;学者们一直在使用所谓的常客统计学来评估实验操作是否具有significant效果。…

saltstack二

配置管理 haproxy的安装部署 haproxy各版本安装包下载路径https://www.haproxy.org/download/1.6/src/&#xff0c;跳转地址为http&#xff0c;改为https即可 创建相关目录 # 创建配置目录 [rootlinux-node1 ~]# mkdir /srv/salt/prod/pkg/ [rootlinux-node1 ~]# mkdir /srv/sa…

319. 灯泡开关

319. 灯泡开关 初始时有 n 个灯泡处于关闭状态。第一轮&#xff0c;你将会打开所有灯泡。接下来的第二轮&#xff0c;你将会每两个灯泡关闭一个。 第三轮&#xff0c;你每三个灯泡就切换一个灯泡的开关&#xff08;即&#xff0c;打开变关闭&#xff0c;关闭变打开&#xff0…