一不小心执行了rm -f,除了跑路,还有什么办法?

珠江路在线   2020年7月28日  【 转载 】 

前言

每当我们在生产环境服务器上执行rm命令时,总是 提心吊胆的,由于一不小心执行了误删, 而后就要 预备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵 。

那么假如真的删除了不该删除的文件, 比方数据库、日志或执行文件,咋办呢?欲知后事如何,请 细心看完本篇博客 。

模仿场景

一. 删除

误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件:

> rm -f /root/selenium/Spider/MySql.Data.dll
> ll /root/selenium/Spider/MySql.Data.dll
ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory

二. 复原

1. 使用lsof命令查看目前是不是有 历程 打开/root/selenium/Spider/MySql.Data.dll文件:

> lsof | grep /root/selenium/Spider/MySql.Data.dll
一不小心执行了rm -f,除了跑路,还有什么

步骤?

从上面 能够看出,目前文件状态为已删除(deleted) 。

2.查看是不是存在 复原数据:

/proc/13067/fd: 历程操作的文件 形容符目录 。

86:文件 形容符 。

> cat /proc/13067/fd/86
一不小心执行了rm -f,除了跑路,还有什么

步骤?

3. 使用I/O重定向 复原文件:

> cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll
> ls -l /root/selenium/Spider/MySql.Data.dll
-rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll

再一次运行程序:

一不小心执行了rm -f,除了跑路,还有什么

步骤?

注明 复原的文件没有问题 。

刨根问底

通过前面的 模仿场景演示了 复原文件的整个过程,那么原理是什么,在什么状况下,文件才是可 复原的 。

在Linux系统中,每个运行中的程序都有一个宿主 历程彼此隔离,以/proc/ 历程号来体现(Linux 性质上便是一个文件系统) 。

比方:ls -l /proc/13067 查看 历程PID为13067的 历程信息;当程序运行时,操作系统会专门开发一块内存区域,提供应目前 历程 使用,关于依赖的文件,操作系统会发放一个文件 形容符,以便读写文件,当我们执行 rm -f 删除文件时,其实只不过删除了文件的目录索引节点,关于文件系统不可见,然而关于 打开它的 历程依旧可见,即 依然 能够 使用先前发放的文件 形容符读写文件,正是利用这样的原理,所以我们 能够 使用I/O重定向的 模式来 复原文件 。

总结

假如不小心误删了文件,不要 焦急,首先 使用 lsof 查看 打开该文件的 历程, 而后再 使用 cat /proc/ 历程号/fd/文件 形容符 查看 复原数据,最终 使用I/O重定向的 模式来 复原文件 。