不小心执行rm-f,该如何恢复?

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不⼩⼼执⾏rm-f,该如何恢复?
每当我们在⽣产环境服务器上执⾏rm命令时,总是提⼼吊胆的,因为⼀不⼩⼼执⾏了误删,然后就要准备跑路了,毕竟⼈不是机器,更何况机器也有bug,呵呵。

那么如果真的删除了不该删除的⽂件,⽐如数据库、⽇志或执⾏⽂件,咋办呢?欲知后事如何,请仔细看完本篇⽂章。

模拟场景
1、删除误删除服务器⽬录/root/selenium/Spider下的MySql.Data.dll⽂件:
1. $ rm -f /root/selenium/Spider/MySql.Data.dll
2. $ ll /root/selenium/Spider/MySql.Data.dll
3. ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory
2、恢复
2.1、使⽤lsof命令查看当前是否有进程打开/root/selenium/Spider/MySql.Data.dll⽂件:
1. > lsof | grep /root/selenium/Spider/MySql.Data.dll
从上⾯可以看出,当前⽂件状态为已删除(deleted)。

2.2、查看是否存在恢复数据:
/proc/13067/fd:进程操作的⽂件描述符⽬录。

86:⽂件描述符。

1. $ cat /proc/13067/fd/86</pre>
2.3、使⽤I/O重定向恢复⽂件
1. $ cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll
2. $ ls -l /root/selenium/Spider/MySql.Data.dll
3. -rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll
重新运⾏程序:
说明恢复的⽂件没有问题。

刨根问底
通过前⾯的模拟场景演⽰了恢复⽂件的整个过程,那么原理是什么,在什么情况下,⽂件才是可恢复的。

在Linux系统中,每个运⾏中的程序都有⼀个宿主进程彼此隔离,以/proc/进程号来体现(Linux 本质上就是⼀个⽂件系统)
⽐如:ls -l /proc/13067 查看进程PID为13067的进程信息;
当程序运⾏时,操作系统会专门开辟⼀块内存区域,提供给当前进程使⽤,对于依赖的⽂件,操作系统会发放⼀个⽂件描述符,以便读写⽂件。

当我们执⾏ rm -f 删除⽂件时,其实只是删除了⽂件的⽬录索引节点,对于⽂件系统不可见,但是对于打开它的进程依然可见。

即仍然可以使⽤先前发放的⽂件描述符读写⽂件,正是利⽤这样的原理,所以我们可以使⽤I/O 重定向的⽅式来恢复⽂件。

总结
如果不⼩⼼误删了⽂件,不要着急。

⾸先使⽤ lsof 查看打开该⽂件的进程。

然后再使⽤ cat /proc/进程号/fd/⽂件描述符查看恢复数据,最后使⽤I/O重定向的⽅式来恢复⽂件。

作者:justmine。

相关文档
最新文档