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

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

 

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

 

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

 

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

 

less /var/log/messages

复制代码

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

 

rm -rf /var/log/messages

复制代码

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

 

lsof | grep deleted   #过滤出已经被删除的所有文件(这里被删除的意思是程序在占用且被删除),在最后一列找到我们需要恢复的文件

复制代码

4.刚上面的命令的结果如下:

$ lsof | grep deleted #过滤出less这个程序所占用的所有文件,在最后一列找到我们需要恢复的文件

rsyslogd   903    root    4w      REG                8,2   595118   13370331 /var/log/messages (deleted)

mysqld    1216    root    5u      REG                8,2        0    3670020 /tmp/ibhP69yb (deleted)

mysqld    1216    root    6u      REG                8,2        0    3670021 /tmp/ib8ArrqS (deleted)

mysqld    1216    root    7u      REG                8,2        0    3670022 /tmp/ibWB4Ihz (deleted)

mysqld    1216    root    8u      REG                8,2        0    3670023 /tmp/ibQgKx9f (deleted)

mysqld    1216    root   12u      REG                8,2        0    3670024 /tmp/ibjXEQkX (deleted)

less      1775    root    4r      REG                8,2   595118   13370331 /var/log/messages (deleted)

复制代码

5.我们可以看到最下面就是我们需要恢复的文件,当然并不一定是在最后。这时候我们需要记住这一行的两个参数,一个是第二列的 PID 还一个是 第4列的数字,这里一般都是数字加字母,但我们只需要数字,这里表示什么我也不知道,记住这个数字就行了

 

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

 

cat /proc/1775/fd/4 #可以看到这里的 1775 就是刚上面的第二列的进程PID 4就是第4列的数字,其它都是固定的。这里输出的内容就是我们刚删除的内容

复制代码

7.这时候我们只需要把这个文件复制一份到原来的目录就可以了

 

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

 

 

THE END
分享
二维码
< <上一篇
下一篇>>