linux lsof原理,Linux lsof工具介绍

引言

在《Linux fuser工具介绍》一文中,与大家一起学习了fuser工具的使用方法。"lsof"——list open files,lsof也是Linux下用于查看打开的文件以及相关联进程信息的工具,相比fuser提供更强大的功能,下面我们就来学习lsof的使用方法。

lsof输出说明

直接执行lsof,将输出系统中所有打开文件的信息,这里说的“文件”不单指一般的文件,还包括目录、socket套接字、设备文件和命名管道:

#lsof

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/libdl-.so

init root , 0t0 /dev/initctl

……

每行显示一个打开的文件,各列含义如下:

COMMAND:与文件关联进程的名称

PID:进程PID

USER:拉起进程的用户

FD:指示进程与文件的关联关系

TYPE:指示文件类型

DEVICE:指示文件所在设备的设备号(major,minor)

SIZE/OFF:指示文件的大小或进程对文件操作的偏移量

NODE:文件索引标识

NAME:文件名

FD列值的含义与fuser查询结果中PID后接字符的含义相同,指示了进程与文件的关联关系,有以下常见取值:

cwd:进程工作目录

txt:进程由该文件拉起(如二进制文件或脚本)

rtd:进程的根目录

mem:内存映射文件

N(u/w/r):指示该文件为进程打开的第N个文件描述符,u为可读可写模式,w为可写模式,r为可读模式

TYPE列有以下常见取值:

REG:一般文件

DIR:目录

CHR:字符设备

BLK:块设备

FIFO:命名管道

PIPE:管道

IPV4:ipv4套接字

unix:unix域套接字

根据以上字段,我们就可以了解到哪个文件以何种关联方式与哪个进程关联。但单执行lsof输出太多,为获取必要输出,我们就得加一些过滤选项。

查询某个进程打开的文件

lsof常见的用法是查找进程打开的文件名称和文件数目,以下我们使用lsof查看pid为14586的syslog-ng进程使用了哪些文件:

# lsof -p

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

syslog-ng root cwd DIR , /

syslog-ng root rtd DIR , /

syslog-ng root txt REG , /sbin/syslog-ng

syslog-ng root mem REG , /lib64/libnss_files-.so

syslog-ng root 0r CHR , 0t0 /dev/null

syslog-ng root 1w CHR , 0t0 /dev/null

syslog-ng root 2w CHR , 0t0 /dev/null

syslog-ng root /var/lib/dhcp/dev/log

syslog-ng root /dev/log

syslog-ng root 5w REG , /var/log/messages

从以上查询结果可知,syslog-ng进程由/sbin/syslog-ng拉起,进程根目录和当前工作目录均为系统根目录,进程的标准输出、标准输入和标准出错输出均被重定向至/dev/null,/var/log/messages被syslog-ng以可写模式打开。

Linux限制了进程能够打开文件的数目,通过如下命令可以查看该限制:

# ulimit -n

若进程打开文件句柄的数目超过系统限制,则相应进程不能正常服务,使用如下方式我们可以查看各个进程打开文件句柄的数目:

# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr| more

查询某个文件被哪些进程打开

lsof命令后直接接文件名,可以查到该文件被哪些进程打开:

# lsof /var/log/messages

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

syslog-ng root 5w REG , /var/log/messages

要删除文件时要先中止进程,而不是直接删除这个文件。

在umount文件系统时,如果文件系统中有打开的文件,那么umount操作会失败,报“device is busy”。这时可使用”lsof /dev/sdaX”显示sdaX文件系统中被打开的所有文件,再关闭所列文件。

进程的当前工作目录影响文件系统的卸载,这也是为什么在编写后台进程时需要将其工作目录设置为根目录的原因,

恢复删除文件

最后,来介绍使用lsof命令恢复被删文件的用法:某文件被删除,但从lsof能查到该文件仍被某进程打开,这时我们可以恢复被删文件。以下通过一个小程序说明该用法:

#include

#include

#include

#include

#include

int main(int argc, char** argv)

{

int fd;

];

fd = open("test.txt", O_RDONLY);

read(fd, buf, );

)

{

sleep();

printf("%s", buf);

}

;

}

以上程序打开test.txt文件并定时输出该文件内容,在编译、拉起该程序之后,我们将test.txt文件删除,之后使用lsof查到打开该文件的进程:

# lsof | grep test.txt

ttt root 3r REG , /tmp/lx/test.txt (deleted)

接着,在/proc中可以看到该进程打开的文件描述符如下:

# ll /proc//fd

total

lrwx------ root root May : -> /dev/pts/

lrwx------ root root May : -> /dev/pts/

lrwx------ root root May : -> /dev/pts/

lr-x------ root root May : -> /tmp/lx/test.txt (deleted)

执行以下命令我们即可将/tmp/lx/test.txt文件的内容恢复至/tmp/test.txt:

# cat /proc//fd/ > /tmp/test.txt

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

小结

本文介绍了lsof的使用方法,包括lsof命令的输出格式,如何根据某进程查询其打开的文件,又如何查询某文件被哪些进程打开,以及判断进程打开文件数是否达到上限的方法、删除文件/卸载文件系统时需注意的事项,最后介绍了使用lsof恢复被删除文件的方法。

Linux性能工具介绍

l  Linux性能工具介绍 p  CPU高 p  磁盘I/O p  网络 p  内存 p  应用程序跟踪 l  操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l  应用程序的性能问题/功能问 ...

常用linux小工具介绍

1.ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM. ctags 最先是 ...

Linux bpytop工具介绍

一.工具简介: Easy to use, with a game inspired menu system. Full mouse support, all buttons with a highli ...

用户管理 之 Linux 用户管理工具介绍

Linux是一个多用户的操作系统,她有完美的用户管理工具,这些工具包括用户的查询.添加.修改,以及用户之间相互切换的工具等:通过这些工具,我们能安全.轻松的完成用户管理: 在这里我们要引入用户控制工具 ...

Rsync,Linux日志及Screen工具介绍

第十六次课 Rsync,Linux日志及Screen工具介绍 目录 一.rsync工具介绍 二.rsync常用选项 三.rsync通过ssh同步 四. rsync通过服务同步 五.linux系统日志 ...

[原创]Linux下网络性能测试Netperf工具介绍及安装

[原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...

Linux 文件内容查看工具介绍-cat,less,more,tail,head

Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...

Linux操作系统的打包/归档工具介绍

Linux操作系统的打包/归档工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

Linux操作系统的压缩、解压缩工具介绍

Linux操作系统的压缩.解压缩工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.compress/uncompress命令常用参数 Linux compress命令: ...

随机推荐

去掉StringBuilder或String 最后一个项逗号

一. sb.Length = sb.Length - 1; 二. stringBuilder.Remove(stringBuilder.ToString().LastIndexOf(','), 1); ...

Asp.net MVC 如何向webform一样在IIS里添加虚拟目录

相信很多用webform的程序猿都习惯性的使用虚拟目录的形式来对一个程序添加新的功能,那么在mvc下该如何来弄呢? 首先得有一个项目基层的项目,然后我们在这个项目的基础上新增一个功能模块,例如信息发布 ...

MDX示例:求解中位数、四分位数(median、quartile)

一个人力资源咨询集团通过网络爬虫采集手段将多个知名招聘网站上发布的求职和招聘等信息准实时采集到自己的库里,形成一个数据量浩大的招聘信息库,跟踪全国招聘和求职的行业.工种.职位.待遇等信息,并通过商业智 ...

juqery dragsort使用遇到的问题

1.destroy时,没给容器加id,不能执行成功--->修改源码如下: if (options == "destroy") { $(this).trigger(" ...

streamsets http client && json parse && local fs 使用

streamsets 包含了丰富的组件,origin processer destination 测试例子为集成了http client 以及json 处理 启动服务 使用docker 创建pipel ...

介绍Visual Studio的Android模拟器

介绍Visual Studio的Android模拟器 http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/introducing-vi ...

Android中免root的hook框架Legend原理解析

一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...

面试------Android 版本之前的差异(常见,欢迎补充)。

不管你技术如何,只要背点这个,能忽悠倒一片.. 1.WebView JS漏洞 ,Android4.2之前 ,解决办法,不用addJavascriptInterface,webchrome的onJsPr ...

js数字格式化千分位格式

带小数点的 var a = 8462948.2453; console.log(a.toLocaleString()) //8,462,948.245 不带小数点的 num.toString().re ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值