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

前言

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

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

模拟场景

1、删除

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

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

2、恢复

(1)、使用lsof命令查看当前是否有进程打开/root/selenium/Spider/MySql.Data.dll文件:

> lsof | grep /root/selenium/Spider/MySql.Data.dll

从上面可以看出,当前文件状态为已删除(deleted)。

(2)、查看是否存在恢复数据:

/proc/13067/fd:进程操作的文件描述符目录。
86:文件描述符。

> cat /proc/13067/fd/86

(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

重新运行程序:

说明恢复的文件没有问题。

刨根问底

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

在Linux系统中,每个运行中的程序都有一个宿主进程彼此隔离,以/proc/进程号来体现(Linux本质上就是一个文件系统),比如:ls -l /proc/13067 查看进程PID为13067的进程信息;当程序运行时,操作系统会专门开辟一块内存区域,提供给当前进程使用,对于依赖的文件,操作系统会发放一个文件描述符,以便读写文件,当我们执行 rm -f 删除文件时,其实只是删除了文件的目录索引节点,对于文件系统不可见,但是对于打开它的进程依然可见,即仍然可以使用先前发放的文件描述符读写文件,正是利用这样的原理,所以我们可以使用I/O重定向的方式来恢复文件。

总结

如果不小心误删了文件,不要着急,首先使用 lsof 查看打开该文件的进程,然后再使用 cat /proc/进程号/fd/文件描述符 查看恢复数据,最后使用I/O重定向的方式来恢复文件。

原文地址:https://www.cnblogs.com/lylsr/p/11228447.html

时间: 2024-10-15 15:40:54

不小心执行 rm -f,该如何恢复?的相关文章

老男孩教育每日一题-2017年5月7日-加餐-linux下面如何实现,执行rm命令,就显示do not use rm command

1.题目-老男孩教育每日一题-2017年5月7日-加餐-linux下面如何实现,执行rm命令,就显示do not use rm command 2.要求结果 [[email protected] ~]# rm do not use rm command 3.答案 这需要使用linux里面的别名 alias rm='echo do not use rm command' 注意: 上面命令还要放入到/etc/profile里面永久生效 4.详细过程 第一个里程碑-如何显示这行文字 [[email p

如何用Dummy实例执行数据库的还原和恢复

今天实验了一下,如何在所有文件,包括数据文件,在线日志文件,控制文件都丢失的情况下,利用RMAN备份恢复和还原数据库.该实验的重点是用到了Dummy实例. 具体步骤如下: 备份数据库 [[email protected] ~]$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on Mon May 25 23:25:51 2015 Copyright (c) 1982, 2011, Oracle and/or its

Linux下通过rm -f删除大量文件时提示"-bash: /bin/rm: Argument list too long"的解决方法

Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long" 如图: 通过ls /var/spool/postfix/maildrop/*|wc -l 发现文件数达到21万多,见附件: 原因:rm -f的参数过多 解决方法:可使用awk一次删除一个的方式进行删除,但必须先进入该目录下,操作方法如下:1.先进入该目录下:cd /var/spool/postfi

[转]Oracle DB 执行表空间时间点恢复

• 列出在执行表空间时间点恢复(TSPITR) 时会发生的操作 • 阐释TSPITR 使用的术语的定义 • 确定适合将TSPITR 用作解决方案的情况 • 确定时间点恢复的正确目标时间 • 确定不能使用TSPITR 的情况以及解决方法 • 执行自动TSPITR 表空间时间点恢复(TSPITR):概念 • 通过执行TSPITR 可将一个或多个表空间快速恢复到以前的某个时间. • 执行TSPITR 不会影响数据库中其它表空间或对象的状态. 使用RMAN 自动表空间时间点恢复(TSPITR) 可将Or

执行 apt-get -f install 提示错误

执行 apt-get -f install 提示错误 分类: Linux 2015-01-24 21:26 554人阅读 评论(0) 收藏 举报 1. 问题: usloft1359:~# rvm install 2.2.0 Searching for binary rubies, this might take some time. No binary rubies available for: debian/6/x86_64/ruby-2.2.0. Continuing with compil

为rm -f 添加回收站功能 防止误删

rm -f 是非常危险的工具,所以有必要添加一个回收站的机制 操作的目标是  rm -f(rm -rf 也是类似的)的时候,实现将文件暂时放到/tmp/trash(手动添加,名称随意)目录下,而不是直接删除,同时rm 其他的操作还能正常使用. 具体实现方法分为两部: 写一个脚本完成检测 rm -f操作 并将文件放到 /tmp/trash alias 把新的脚本命名为 rm 脚本放在/bin下比较方便 vi /bin/fake-rm #!/bin/bash ######### #FAKE RM #

rm -f + 文件名+* 与 rm -f + 文件名* 的不同效果,大坑呀。

rm -f catalina.2018-10-22.*    与*号见无空格 rm -f catalina.2018-10-22. *    :多了空格: 原文地址:https://www.cnblogs.com/brianlai/p/9833840.html

误删:[[email protected] scripts]# rm -f /usr/bin/ssh-copy-id

误删除:[[email protected] scripts]# rm -f /usr/bin/ssh-copy-id 的配置文件怎么办? 莫慌!!!你的备份服务器上也有相同的配置文件,以下操作可以帮忙!!! 敲重点!!!!一.[[email protected] ~]# scp -P52113 -rp /usr/bin/ssh-copy-id 10.0.0.61:/usr/binscp 指定端口 -rp 把本机下此配置文件 传输一份到61的机器下的/usr/bin目录下 [email prot

Ubuntu 16.04使用rm -rf误删文件恢复方法收集

说明:不一定有效,需要不断尝试 一.lsof 文件刚刚被删除,想要恢复,先尝试lsof. lsof |grep data.file1 cp /proc/xxx/xxx/xx /dir/data.file1 如果lsof不能看到文件,那么就需要使用恢复软件进行恢复. 要做的第一件事是立刻卸载被误删除文件所在的分区,或者重新以只读方式挂载此分区. umount /dev/part 或 mount -o remount,ro /dev/part 删除一个文件,就是将文件inode(inode 是操作系