例用lsof命令恢复linux误删除文件(正在使用的文件)
首先我们要知道lsof这个命令是做什么用的,简单的讲就是列出当前打开的程序,进程或者用户所使用的所有文件(是正在使用的)
在这之前我们要搞清楚一个理论知识:那就是句柄(这里我用缓存来理解的,这样更容易理解)及空间释放问题
打个比方:在生产环境中,有维护人员正在用 tail 命令查看一个日志,然后另一个维护人员用rm -rf 命令把这个日志给删除了。但是这时其实你的空间还没有真正的释放,因为为还有用户占用着这个文件,所以在缓存中这个文件还是存在的。那么我们就可以通这个缓存把文件给恢复回来。下面我们开始实验
1.首先我们用下面的命令查看我们的 less /var/log/messages 然后再按我们键盘上的 ctrl + z 先暂停(注意,这时候我们的 less 命令占用着这个文件)
- less /var/log/messages
- rm -rf /var/log/messages
- lsof | grep deleted #过滤出已经被删除的所有文件(这里被删除的意思是程序在占用且被删除),在最后一列找到我们需要恢复的文件
- $ 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)
6.我们使用下面的命令查看
- cat /proc/1775/fd/4 #可以看到这里的 1775 就是刚上面的第二列的进程PID 4就是第4列的数字,其它都是固定的。这里输出的内容就是我们刚删除的内容
- cp /proc/1775/fd/4 /var/log/messages
编辑回复