lsof 进程与文件

简介

lsof(list open files)是一个列出当前系统打开文件的工具.

说明

在LINUX环境下, 一切皆文件.
通过文件可以访问常规数据, 还可以访问网络连接、硬件.
应用程序可以通过文件描述符操作该资源, 文件描述符为应用程序与基础操作系统之间的交互提供了通用接口. 
应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息, 而你可以通过lsof工具能够查看这个列表对系统监测以及排错,这就是lsof的强大之处.
注意: 在终端下输入lsof即可显示系统打开的文件, 因为lsof需要访问核心内存和各种文件, 所以必须以root用户的身份运行它才能够充分地发挥其功能.

功能

1. 文件被哪个进程打开
2. 查询指定目录下被进程开启的文件
3. 进程打开了哪些文件
4. 进程组打开了哪些文件

场景

# 显示占用口令文件的进程
lsof /etc/passwd

# 显示打开用户yoyou主目录下文件的进程(不计子目录)

# 显示打开光盘里文件的进程(包括子目录)
lsof -D /dev/cdrom

# 查询用户yoyou相关进程使用文件情况
lsof -u yoyou

# 查出进程组520里进程打开的文件
lsof -g 520

# 显示a.out进程打开的文件
lsof -c a.out

# 查找进程号为1234打开的文件
lsof -p 1234

# 找出打开80端口的进程
lsof -i:80

相关

fuser

其它

<<恢复删除的文件>>
当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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值