lsof 简介


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

Linux中一切皆文件,所以在系统中,被打开的文件可以是普通文件、目录、网络文件系统中的文件、字符设备、管道、socket等

如何知道现在系统打开的是哪些文件?及这些文件的相关信息呢?

lsof命令就是帮我们查看打开文件的信息的

基本用法


查看进程打开的文件

例如查看mysql在操作哪些文件

# lsof -c mysql

查看文件对应的进程

例如查看系统日志文件是在被谁操作

# lsof /var/log/messages

实用案例


(1)查看某进程正在操作哪些文件

命令

# lsof -p PID

这个命令很有用,例如系统I/O负载过高时,我们可以使用topiotop找出是哪些进程导致了I/O压力,然后就使用lsof命令查看这个进程正在操作哪些文件,从而分析出现异常的原因

之前的文章 “Nginx写IO占用高故障处理”,介绍了相关思路

(2)查看某端口正在被谁使用

使用 lsof 还可以查找使用了某个端口的进程

比如发现系统有个不明端口,就需要使用lsof命令检查是谁在使用,来判定是否出现安全问题

命令

# lsof -i:端口号

(3)恢复删除的文件

linux中删除文件要谨慎,不像windows那么容易被恢复,如果文件被不小心删除,可以使用lsof来恢复,但前提是:这个文件正在被某个进程使用

还有,当系统受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹,如果能恢复日志文件,对解决安全问题非常有帮助

现在假设/var/log/messages被删除了,首先来确认一下当前是否有进程正在使用这个文件,如果有,就可以恢复了

//查看哪个进程在使用此文件
# lsof | grep message

//重写文件
# cat /proc/端口号/fd/2 > /var/log/messages