使用lsof命令恢复linux误删除文件

回复 收藏
例用lsof命令恢复linux误删除文件(正在使用的文件)



首先我们要知道lsof这个命令是做什么用的,简单的讲就是列出当前打开的程序,进程或者用户所使用的所有文件(是正在使用的


在这之前我们要搞清楚一个理论知识:那就是句柄(这里我用缓存来理解的,这样更容易理解)及空间释放问题



打个比方:在生产环境中,有维护人员正在用 tail 命令查看一个日志,然后另一个维护人员用rm -rf 命令把这个日志给删除了。但是这时其实你的空间还没有真正的释放,因为为还有用户占用着这个文件,所以在缓存中这个文件还是存在的。那么我们就可以通这个缓存把文件给恢复回来。下面我们开始实验



1.首先我们用下面的命令查看我们的 less /var/log/messages 然后再按我们键盘上的 ctrl + z 先暂停(注意,这时候我们的 less 命令占用着这个文件)

  1. less /var/log/messages
2.然后我们用 rm -rf /var/log/messages 删除这个文件

  1. rm -rf /var/log/messages
3.你可以 ls 看下我们的这个文件已经被删除了,这时候不要惊慌,我们现在来恢复,首先,我们要使用 lsof 命令找到 less 这个程序占用着哪些文件

  1. lsof | grep deleted   #过滤出已经被删除的所有文件(这里被删除的意思是程序在占用且被删除),在最后一列找到我们需要恢复的文件
4.刚上面的命令的结果如下:
  1. $ lsof | grep deleted #过滤出less这个程序所占用的所有文件,在最后一列找到我们需要恢复的文件
  2. rsyslogd   903    root    4w      REG                8,2   595118   13370331 /var/log/messages (deleted)
  3. mysqld    1216    root    5u      REG                8,2        0    3670020 /tmp/ibhP69yb (deleted)
  4. mysqld    1216    root    6u      REG                8,2        0    3670021 /tmp/ib8ArrqS (deleted)
  5. mysqld    1216    root    7u      REG                8,2        0    3670022 /tmp/ibWB4Ihz (deleted)
  6. mysqld    1216    root    8u      REG                8,2        0    3670023 /tmp/ibQgKx9f (deleted)
  7. mysqld    1216    root   12u      REG                8,2        0    3670024 /tmp/ibjXEQkX (deleted)
  8. less      1775    root    4r      REG                8,2   595118   13370331 /var/log/messages (deleted)
5.我们可以看到最下面就是我们需要恢复的文件,当然并不一定是在最后。这时候我们需要记住这一行的两个参数,一个是第二列的 PID 还一个是 第4列的数字,这里一般都是数字加字母,但我们只需要数字,这里表示什么我也不知道,记住这个数字就行了

6.我们使用下面的命令查看

  1. cat /proc/1775/fd/4 #可以看到这里的 1775 就是刚上面的第二列的进程PID 4就是第4列的数字,其它都是固定的。这里输出的内容就是我们刚删除的内容 
7.这时候我们只需要把这个文件复制一份到原来的目录就可以了

  1. cp /proc/1775/fd/4 /var/log/messages








2015-12-11 13:37 举报
已邀请:
0

smiock

赞同来自:

mark
0

maria

赞同来自:

学习了!
0

beyondlee2011

赞同来自:

感谢分享。
0

jxcia2018

赞同来自:

楼主 ,其实用这个903的进程也是可以的哦{:4_91:}
rsyslogd   903    root    4w      REG                8,2   595118   13370331 /var/log/messages (deleted)
0

riverxyz

赞同来自:

如果是只有自己一个人误删除也就是这个文件没有被占用,使用哪个命令呢?
0

qwlp19910807

赞同来自:

学习了lsof的用法
0

CASLOST

赞同来自:

riverxyz 发表于 2016-8-8 15:57
如果是只有自己一个人误删除也就是这个文件没有被占用,使用哪个命令呢?

大概只能通过debugfs这类的工具进行恢复吧

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: