首先我们要知道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