Linux 命令 之 lsof (恢复误删文件)

介绍

lsof(list open files)是一个列出当前系统打开文件的工具。而在Unix系统中一切(包括网络套接口)都是文件

如常见的TCP 与 UDP 协议套接字

无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息

由此看来,lsof是不可多得的系统检测与排错工具

语法

lsof  [  -?abChlnNOPRtUvVX  ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g
[s] ] [ -i [i] ] [ -k k ] [ -K k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s [p:s]  ]
[ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]

如上所示,lsof有着令人惊讶的选项数量(revision 4.87)

  • 你可以用它来获取打开某个文件的进程(lsof filename)
  • 你可以使用它来获得某个端口的使用信息(lsof -i:port)
  • 你能通过它了解到指定的用户正在碰什么东西(lsof -u username)
  • 甚至是一个进程正在使用什么文件(lsof -p pid)

恢复删除的文件(Linux)

文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中).

当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容.,进程可能还在使用(此时可以恢复)。只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据

proc文件系统可以协助我们恢复数据. 每一个系统上的进程在/proc都有一个目录和自己的名字(/proc/pid): 里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接). 如果从文件系统中删除一个文件, 此处还有一个inode的引用

因此,你所需要做的便是拿到打开文件的进程号(pid)和 文件描述符(fd)。而这些通过lsof工具都可以信手拈来

下面在CentOS 7 系统中演示怎样恢复一个被删除的文本文件

1. 首先,新建一个文本,写入一些内容

新建文本内容

2. 然后使用 vi 打开这个文本,同时删除它

3. 查看占用这个文件的进程

查看打开文件的进程

4. cd 到 /proc 相应目录,并查看详细信息

查看详细信息

5. 恢复文件,并查看

结果

可以看到,除了前面的乱码,后面的内容就是先前写入 test.txt 的内容

其他常见用法

  1.  列出所有打开的文件 —— lsof (不加任何参数)
  2.  查看使用某个文件的进程 —— lsof filename
  3.  查看某个端口的占用情况 —— lsof -i:port
  4.  列出所有的网络连接 —— lsof -i
  5.  列出所有的TCP连接 —— lsof -i tcp
  6.  列出所有的UDP连接 —— lsof -i udp
  7.  查看某个程序打开的文件信息 —— lsof -c 程序名(如mysql)
  8.  查看某个进程打开的文件信息 —— lsof -p pid
  9.  递归地查看某个目录下所有文件的信息(类似于批量使用 lsof filename,包含子目录,速度较慢)—— lsof +D filepath
  10.  递归地查看某个目录下所有文件的信息(类似于批量使用 lsof filename,不包含子目录,速度较快)—— lsof +d filepath

小结

lsof 是一个非常强大的命令,某些时候能作为netstat 和 ps 的替代品使用

 

 

评论或私信站长


  1. #该文章暂时没有评论