在linux中,一切都是文件。在系统中,被打开的文件可以是普通文件,目录,网络文件系统中的文件,字符设备,管道等。那么lsof命令则是一个列出当前系统中所有打开文件的工具。这个命令在系统中可能并未默认安装,在Centos在联网情况下,输入yum install lsof -y即可安装。该命令的使用方法如下:
lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -u username 显示所属于user进程打开的文件
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -i 用以显示符合条件的进程情况
这个命令可以在不加任何参数的情况下直接运行,但是该命令一定需要root账号来执行,因为lsof在运行时会访问很多核心文件,如图所示:
参数 | 说明 |
---|---|
COMMAND | 进程的名称 |
PID | 进程标识符 |
TID | 线程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件 |
TYPE | 文件类型,如DIR,REG等 |
DEVICE | 磁盘的名称 |
SIZE | 文件大小 |
NODE | 索引节点 |
NAME | 打开文件的全路径名称 |
linux系统中有很多日志文件会不断的被写入、更新,/var/log/messages就是其中的一个,查看该文件:
lsof的另一个用法是:当使用umount卸载时,系统提示device is busy,无法卸载。首先先用lsof命令确认一下,确认有进程占用了该目录后,进该目录后使用cd命令找到家目录后,然后再使用lsof确认无进程占用。
使用lsof命令还有个更实用的功能:可以通过其恢复被删除的文件,但前提是文件正在被某个进程使用,而且该进程未停止。现假设文件/var/log/messages不小心被删除了,首先确认一下当前是否有进程正在使用该文件,如果有则继续,命令如下:
执行完上述命令后重启服务即可。