Linux lsof命令使用详解

来源:脚本之家  责任编辑:小易  

lsof命令会列出进程打开、使用的文件,但是只输入lsof命令时,lsof会将系统上面所有已经打开的文件都列出来,所以使用lsof命令需要加上一些选项,让它只列出我们想要的内容。 用法一、列出某个用户的进程打开的文件,要用lsof命令的-u选项,比如

lsof(list open files)是一个查看进程打开的文件的工具。

1. Top:监测Linux进程 Linux Top命令是一个性能监测程序,它经常被许多系统管理员用来监测Linux性能,在许多类似Linux/Unix的操作系统环境下都能找到。Top命令可用于显示所有运行中和活动的实时进程(按顺序排列),并且定期更新。它可显示处理

在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。

1)使用lsof命令 lsof是一个非常强大的linux工具,她被用来查找哪些程序使用了那些文件。在linux系统下,基本上所有的东西都可以被当作文件来用。socket当然也是一种文件了。所以lsof可以用来查找谁用了某一个端口。具体方法: lsof -i :port_nu

常用选项

因为你编辑的并不是good.txt。而是你vi 的那个当前目录下隐藏的.good.txt.swp文件。 vi 并不会直接修改当前文件,而是先生成一个临时文件让你编辑,当你编辑完以后 比如输入:w 才会写回good.txt文件。

-a 指示其它选项之间为与的关系

[root Mon Oct 16 23:35:22@iZ259r7h4pfZ ~]netstat -tpln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3691 0.0.0.0:* LISTEN 8688/svnserve tcp

-c <进程名> 输出指定进程所打开的文件

微信对话行一旦删除了,再次通话的时候,你会发现,又要重新开始新的界面了。本文章教你怎么恢复以前被删掉的对话。工具/原料智能手机一部微信(IOS可以,安卓的不行)一粒云盘方法/步骤打开微信,点击右上角添加朋友输入“:recover”注意冒号也是要写进去的,但是“”就不要写进去了方法/步骤2点击搜索,进入故障修复页面,这里可以看到很多的选项选择微信消息与通讯录,然后被你删掉的信息就会一个个恢复了,这时候打开你的会话栏,你就看到以前被删掉的信息全部出来了。END注意事项微信修复选项只能恢复一次,如果你只修复过微信消息与通讯录,下次再进入故障修复的时候,就会发现找不到“微信消息与修复”这个选项了恢复的

-d <文件描述符> 列出占用该文件号的进程

产后松弛的肚皮如何变平坦小腹呢?1??一定保证充分睡眠睡眠能帮助控制脂肪细胞体积,促进血液循环并促进真皮纤维增生,以增加肌肤的弹性。如果是产后有失眠症状的新妈妈们,可以每天做30~60分钟的有氧运动;一天3次,每次10分钟的散步对睡眠也很有帮助。2??一定少吃高脂肪高热量的食物产后的新妈妈们需要注意,在饮食上应少吃多脂肪高热量的食物,本身腹部就很容易会松弛,如果再吃多脂肪的食物,那么,会增加腹部的脂肪堆积,从而令松弛的赘肉感更加明显,也不利于收紧腹部。所以,在饮食上也是需要多多注意的,可以多吃一些低热量少脂肪的水果蔬菜,在为身体增加营养的同时,也能够减少腹部的赘肉堆积,从而恢复苗条的好身段。在

+d <目录> 输出目录及目录下被打开的文件和目录(不递归)

2499元的小米6发布,雷军将其描述为:你等了203天,我们等了7年。然后我在朋友圈看到,有人将之称为“一个时代的结束”,什么时代?所指的在我看来应该是“1999元”这个时代。更有人调侃,雷军等了7年,终于可以“涨价”了!大家都以为自己很了解小米,其实是你们都看错了雷军。雷军在发布会上强调了一句话:要将高性价比进行到底!小米6定价2499元高了吗?处理器高通满血8356GLPDDR4X内存64/128GB存储UFS(敲黑板!不用担心eMMC混用)屏幕高亮屏夜光屏(未透露厂家)玻璃机身,四曲面不锈钢边框广角/长焦双摄这样的配置,2499绝对是良心的价格,唯一的不足,肯定又要抢,不抢都没天理233

+D <目录> 递归输出及目录下被打开的文件和目录

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

-i <条件> 输出符合条件与网络相关的文件

-n 不解析主机名

-p <进程号> 输出指定 PID 的进程所打开的文件

-P 不解析端口号

-t 只输出 PID

-u 输出指定用户打开的文件

-U 输出打开的 UNIX domain socket 文件

-h 显示帮助信息

-v 显示版本信息

基本输出

如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:

COMMAND:程序的名称

PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件

TYPE:文件类型,如 DIR、REG 等

DEVICE:以逗号分隔设备编号

SIZE:文件的大小(bytes)

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

下面简单介绍一下 FD 列和 TYPE 列中的常见内容。

FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件:

还有一部分 FD 是以数字表示的,比如标准输入输出文件:

数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

下面我们来介绍一些 lsof 命令的常见用法。

查看哪些进程打开了某个文件

直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程:

$ sudo lsof /bin/bash

除了普通文件,也可以是设备等文件(下面命令的输出很长,图示只是截取的一小部分):

$ sudo lsof /dev/sda1

查看哪些进程打开了某个目录及目录下的文件

这里分两种情况,+d 选项不执行递归查询,只查找那些打开了指定目录以及指定目录下文件和目录的进程,比如:

$ sudo lsof +d /var/log

而 +D 选项则会对指定的目录进行递归:

$ sudo lsof +D /var/log

在卸载文件系统时,如果有进程打开了该文件系统中的文件或目录,卸载操作就会失败。因此最好在卸载文件系统前通过 lsof +D 检查文件系统的挂载点,杀掉相关的进程然后再执行卸载操作。

查看某个进程打开的所有文件

通过 -p 选项并指定进程的 PID 可以输出该进程打开的所有文件。比如我们想要查看 cron 程序打开的文件,可以先用 ps -C cron 命令查出进程的 PID:

然后把该 PID 传递给 lsof 命令的 -p 选项:

$ sudo lsof -p 1152

组合多个选项

如果为 lsof 命令指定多个选项,这些选项间默认是或的关系。也就是说满足任何一个选项的结果都会被输出。可以添加额外的 -a 选项,它的作用就是让其它选项之间的关系变为与,比如下面的命令:

$ sudo lsof -a -p $$ -d0,1,2

其中的 -p 选项指定了当前进程的 PID,而 -d 选项则用来指定进程打开的文件描述符(可以通过逗号分隔多个文件描述符)。添加 -a 选项后,结果输出为当前进程打开的文件描述符为 0、1、2 的文件。

说明,-a 选项的使用有很多条件,具体请参考 lsof man page。

查看指定名称的程序打开的文件

通过 -c 选项可以匹配进程运行的程序(可执行文件)名称。比如我们要查找以字母 cr 开头的程序打开的文件列表:

$ sudo lsof -c cr

还可以同时指定多个 -c 选项,它们之间是或的关系。

如果想对 -c 选项的条件取反,只要在字符串前添加符号 ^ 就可以了,比如:

$ sudo lsof -c ^cr

-c 选项也支持正则表达式,比如下面的命令可以过滤出以 cra 和 cro 开头的程序打开的文件:

$ sudo lsof -c /cr[ao]/

查看被打开的与网络相关的文件

-i 选项用来查看被打开的和网络相关的文件,其参数的格式如下:

[46][protocol][@hostname|hostaddr][:service|port]

46 表示 IP 协议的版本

protocol 表示网络协议的名称,比如 TCP 或 UDP

hostname 或 hostaddr 表示主机地址

service 指 /etc/services 中的名称,比如 smtp 或多个服务的列表

port 表示端口号,可以指定一个或多个

-i 选项默认会同时输出 IPv4 和 IPv6 打开的文件:

$ sudo lsof -i

只列出 IPv4 或 IPv6 打开的文件

$ sudo lsof -i 4 $ sudo lsof -i 6

列出与 22 号端口相关的文件

$ sudo lsof -i:22

列出指定范围内被打开的 TCP 端口

$ sudo -i TCP:1-1024

查看被打开的 UNIX domain socket 文件

-U 选项输出打开的 UNIX domain socket 文件,这里我们结合 -c 选项来查看 ssh 服务打开的 UNIX domain socket 文件:

$ sudo lsof -a -c sshd -U

查看某个用户打开的所有文件

-u 选项可以指定用户名或 user ID,并且和 -c 选项一样,可以通过逗号分隔多个用户名称或 user ID,也可以通过符号 ^ 对条件取反。

查看某个用户打开的所有文件

$ sudo lsof -u syslog

查看用户 nick 打开的网络相关的文件

$ sudo lsof -a -i -u nick

排除某个用户

$ sudo lsof -i -u ^nick

注意:在有排除条件时,不需要指定 -a 选项。

杀掉某个用户打开了文件的所有进程

$ kill -9 $(lsof -t -u nick)

该命令中的 -t 选项让 lsof 命令只输出进程的 PID:

统计系统打开的文件总数

$ sudo lsof -P -n | wc -l

命令中的 -P 选项表示不解析端口号,-n 选项表示不解析主机名,这两个选项主要的目的是为了提升 lsof 命令的执行速度。wc -l 命令则用来统计 lsof 命令输出的行数。

恢复删除的文件

如果我们一不小心删除了文件,而又知道这个文本被某个进程打开着,就可以通过 lsof 命令来恢复该文件。具体的原理为:

当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。lsof 程序就是使用这些信息和其他关于内核内部状态的信息来产生其输出。所以 lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是说我们通过访问进程的文件描述符可以找到该文件的相关信息。

下面的 demo 演示如何通过 lsof 命令恢复被误删的 /var/log/syslog 文件。

先删除日志文件 /var/log/syslog,记着要提前备份一下这个文件,以防万一:

$ sudo rm /var/log/syslog

从上面的信息可以看到 PID 为 1141 的进程打开着该文件,文件描述符为 7,并且显示该文件已经被删除了。接下来我们通过 1141 号进程的文件文件描述符来查看该文件的内容:

$ sudo tail -n 5 /proc/1141/fd/7

上图说明文件 /var/log/syslog 文件的内容还在,并且可以通过文件描述符访问,接下来通过 IO 重定向的方式重新创建 /var/log/syslog 文件就可以了:

$ sudo sh -c 'cat /proc/1141/fd/7 > /var/log/syslog'

然后修复文件的权限属性并重启 rsyslog 服务:

$ sudo chown syslog:adm /var/log/syslog $ sudo systemctl restart rsyslog.service

这样就完成了 /var/log/syslog 文件的恢复工作。对于许多应用程序,尤其是日志文件和数据库文件,都可以通过这种方式来恢复。

帮助

-h 选项会输出 lsof 命令的帮助信息:

估计这样的帮助信息也只能逼着你去读 man page 了!

总结

lsof 并不是一个简单的命令,从其 man page 的长度就可以体会到这一点。从本文介绍的小 demo 入手或许可以让你忘记冗长的文档说明,一步步的开始使用并最终掌握这个命令。

参考:

lsof man page

linux lsof命令详解

10 lsof Command Examples in Linux

Linux lsof Command Tutorial for Beginners (10 Examples)

15 Linux lsof Command Examples (Identify Open Files)

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

Linux下用 lsof 命令查找指定端口被哪个进程占用

1)使用lsof命令lsof是一个非常强大的linux工具,她被用来查找哪些程序使用了那些文件。在linux系统下,基本上所有的东西都可以被当作文件来用。socket当然也是一种文件了。所以lsof可以用来查找谁用了某一个端口。具体方法:

lsof -i :port_number |grep "(LISTEN)"

-i是用来查找和网络相关的文件,":"号是必须的,它是标志你查找的是一个端口。port_number就是你要查找的端口号,譬如你要查找是否 有程序占用了oracle的监听端口1521,就可以使用lsof -i :1521 |grep "(LISTEN)"。如果有程序已经占用了,那么下面打印的第二个字段就是该程序的进程id,第一个字段是进程的名字。

如果只有losf -i :port_number可能会查到很多应用程序,但这些程序实际并没有占用你指定的端口,这些端口只是连接到本机器或者别的机器的该端口。所以要grep "(LISTEN)“,因为一个端口只可能被一个程序占用的,所以这种方法是可靠的。

2)使用netstat 命令

大家一定对这个命令比较熟悉了,可能你从没有想到用到来查找哪一个程序的占用了指定的端口。但是netstat -an 的确提供了这种功能。所以有问题了一定要想到先去查找man手册,不过说实话,某些man手册写得让中国人看不懂,那没有办法了,就googe或者 baidu一下吧。

执行man netstat命令,你会发现netstat 提供了'-p'的选项,这个选项的功能是告诉你哪个程序占用了该端口,但是她提供的形式比较古怪是以pid/process_name提供的。pid当然 是进程id了,process_name是进程的命令,中间以'/'号分隔。

和上面的原因一样,我们只查找listen的端口,netstat 给我们提供了-l的选项,这个选项不是默认的选项。

下面以1521端口来看怎么查找到该程序,我们使用下面的命令:

netstat -lnp|awk 'BEGIN{prt=":1521$"}{if ($4 ~ prt) print $0}'

在这里使用awk来匹配第4个字段的模式是为了避免误判。

关于linux lsof命令

这是很自然的,

jar“文件”是linux操作系统里面的概念

class则是jvm虚拟机的概念

要查看应用加载的class你应该用jvisualvm(在jdk的bin目录下)

linux系统中netstat和lsof命令的详细使用

参*驴是的念来过倒

Linux下用 lsof 命令查找指定端口被哪个进程占用

比如8080端口被占用,通过lsof -i: 端口号命令,查询出一些占用的信息,

每个信息有PID,直接kill -9 PID 对应的 pid就可以杀死该进程!

关于lsof命令查看某个文件被哪个进程打开

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

lsof使用

lsof输出信息含义:

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

command pid user fd type device size node name

init 1 root cwd dir 3,3 1024 2 /

init 1 root rtd dir 3,3 1024 2 /

init 1 root txt reg 3,3 38432 1763452 /sbin/init

init 1 root mem reg 3,3 106114 1091620 /lib/libdl-2.6.so

init 1 root mem reg 3,3 7560696 1091614 /lib/libc-2.6.so

init 1 root mem reg 3,3 79460 1091669 /lib/libselinux.so.1

init 1 root mem reg 3,3 223280 1091668 /lib/libsepol.so.1

init 1 root mem reg 3,3 564136 1091607 /lib/ld-2.6.so

init 1 root 10u fifo 0,15 1309 /dev/initctl

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。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 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 fd 都是从 3 开始。

与 fd 列相比,type 列则比较直观。文件和目录分别称为 reg 和 dir。而chr 和 blk,分别表示字符和块设备;或者 unix、fifo 和 ipv4,分别表示 unix 域套接字、先进先出 (fifo) 队列和网际协议 (ip) 套接字。

lsof常用参数

lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux*了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是:

# lsof [options] filename

常用的参数列表:

lsof filename 显示打开指定文件的所有进程

lsof -a 表示两个参数都必须满足时才显示结果

lsof -c string 显示command列中包含指定字符的进程所有打开的文件

lsof -u username 显示所属user进程打开的文件

lsof -g gid 显示归属gid的进程情况

lsof +d /dir/ 显示目录下被进程打开的文件

lsof +d /dir/ 同上,但是会搜索目录下的所有目录,时间相对较长

lsof -d fd 显示指定文件描述符的进程

lsof -n 不将ip转换为hostname,缺省是不加上-n参数

lsof -i 用以显示符合条件的进程情况

lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

46 --> ipv4 or ipv6

protocol --> tcp or udp

hostname --> internet host name

hostaddr --> ipv4地址

service --> /etc/service中的 service name (可以不只一个)

port --> 端口号 (可以不只一个)

例如: 查看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使用实例

一、查找谁在使用文件系统

在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过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

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

# lsof -i:3306

查看3306端口被谁占用

Ubuntu Linux 命令一句话技巧集合Linux Web服务器网站故障分析常用的命令

延伸阅读

抱歉,暂无相关内容!

10 个你需要了解的 Linux 网络和监控命令

30个实用的Linux find命令示例

Git命令10个很有用的使用技巧

  • 本文相关:
  • linux系列之常用运维命令整理笔录(小结)
  • linux常见基本命令与用法大全
  • linux traceroute命令使用详解
  • linux传输文件命令 rz 和 sz详解
  • 详解linux中的awk命令
  • linux不支持所有命令的解决办法
  • vmware虚拟机安装centos操作系统的教程
  • linux模拟网络丢包与延迟的方法
  • linux基础学习之利用tcpdump抓包实例代码
  • ubuntu下telnet服务器的配置方法
  • 在debian系的linux中编译并安装ixgbe驱动的教程
  • centos 5.4系统下安装vpn(pptp) 适用于linux服务器
  • linux中expect的介绍与使用示例
  • centos7下如何配置ip forward(虚拟路由器)
  • 详解linux驱动中,probe函数何时被调用
  • centos 最新版本git的安装教程
  • Linux下用 lsof 命令查找指定端口被哪个进程占用
  • 关于linux lsof命令
  • linux系统中netstat和lsof命令的详细使用
  • Linux下用 lsof 命令查找指定端口被哪个进程占用
  • 关于lsof命令查看某个文件被哪个进程打开
  • 利用lsof去查看Unix/Linux进程打开了哪些文件
  • 如何使用linux系统自带工具和命令进行性能管理
  • linux如何查看端口被哪个进程占用
  • linux操作系统lsof good.txt命令不显示进程
  • Linux下用 lsof 命令查找指定端口被哪个进程占用
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved