干货,不小心执行了rm -f,除了跑路,如何恢复?

作者:justmine
头条号:大数据与云原生
微信公众号:大数据与云原生
创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
为了方便阅读,微信公众号已按分类排版,后续的文章将在移动端首发,想学习云原生相关知识,请关注我

前言

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

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

模拟场景

1. 删除

误删除服务器目录/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

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重定向的方式来恢复文件。

最后

如果有什么疑问和见解,欢迎评论区交流。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】,这将成为我写作的动力。
如果你对Linux感兴趣的话可以【关注我】,我会定期的在博客分享我的学习心得。
欢迎转载,请在明显位置给出出处及链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构----二叉树叶子结点到根节点的高度计算

数据结构----二叉树叶子结点到根节点的高度计算 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {int data;struct bstTree* lchild, *rchild; }bstTree; void createBSTTree(bstTree* & T, int data) {//创建二叉排序树bst…

nginx 带宽_前端工程师不可不知的Nginx知识

历史背景互联网的全球化导致了互联网的数据量快速增长&#xff0c;加上在本世纪初摩尔定律在单核 CPU 上的失效&#xff0c;CPU 朝着多核方向发展&#xff0c;而 Apache 显然并没有做好多核架构的准备&#xff0c;它的一个进程同一时间只能处理一个连接&#xff0c;处理完一个请…

网格路径最小数字和

给定一个包含非负整数的 m x n 网格&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 数据范围&#xff1a; n < 100,m < 100; 输入&#xff1a; 3 3 1 3 1 1 5 1 4 2 1 输出&a…

word List 19

word List 19 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

矩形法_字体设计 | 新手必学,超简单的矩形造字法!!

点击蓝字关注&#xff0c;创智助你长姿势作为一个刚刚踏入设计界的“萌新”来说&#xff0c;字体设计可能是除了版式设计之外最简单的功课了&#xff0c;那么今天教学内容就是最简单的字体设计&#xff1a;矩形造字法。矩形造字法是以软件中的“矩形工具”为基础&#xff0c;以…

NETCore Bootstrap Admin 通用后台管理权限 [1]: 前后台分离系统简介

前言从事软件开发这个行业现在已经有十几年了&#xff0c;项目无论大小权限认证、授权模块总是或多或少有功能需求的&#xff0c;这一块费时费力但是又存在于后台&#xff0c;使用最多的可能是运维人员所以处于出力不讨好的尴尬地位&#xff0c;每次有新的项目总是要耗费不少时…

不同路径 I

一个机器人位于一个 n * m 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。(n表示行&#xff0c;m表示列) 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。 问总共有多少条不同…

数据结构---前序和中序遍历的二叉树序列还原二叉树

数据结构—前序和中序遍历的二叉树序列还原二叉树 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {char data;struct bstTree* lchild, *rchild; }bstTree; bstTree * reStoreTree(char* pre, int preSt, int preEnd, char *mi…

c++ 位运算_C语言之运算符

运算符代表的是各种各样的运算(操作)已知的运算符&#xff1a; - * / (赋值)1.运算符的分类运算符的分类方法很多&#xff0c;通常用功能或者操作数个数进行分类功能&#xff1a;算数运算符 逻辑运算符 位运算符 地址运算符.......操作数个数&#xff1a;单目运算符 双目运算符…

微软 PowerBI 被评为商业智能领导者-13年的企业产品奋斗史解读

恭喜微软连续 13 年被Gartner评为BI平台领导者。您可以插上耳机&#xff0c;打开音乐来一起欣赏这个过程。原文地址&#xff1a;https://powerbi.microsoft.com/zh-cn/blog/microsoft-named-a-leader-in-gartners-2020-magic-quadrant-for-analytics-and-bi-platforms/被评为第…

word List20

word List20 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

[python交互]Excel催化剂与python交互原理剖析,py开发者按此规范可自行扩展功能...

只需简单地编写小段py脚本&#xff0c;就可以借助Excel催化剂的平台作用&#xff0c;将写出的py脚本&#xff0c;嫁接到Excel的环境上使用&#xff0c;在Excel的广阔用户群体上带来更多的产出价值。也大大增加了将自己的python技能输出到普通用户可享用的层面。按照本文的规范&…

background图片不显示_一种解决Retina屏幕1px边框显示问题的方案

一、背景介绍&#xff1a;Retina是一种新型高分辨率的显示标准&#xff0c;是把更多的像素点压缩至一块屏幕里&#xff0c;从而达到更高的分辨率并提高屏幕显示的细腻程度&#xff1b;同时CSS样式表中px单位是一个相对值&#xff0c;并不是绝对值&#xff0c;实际在Retina屏幕中…

gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

当你第一次定义Protocol Buffer的消息的时候&#xff0c;你肯定会给消息设定一套规则需求。但是随着时间的推进&#xff0c;你的业务可能会发生了变化&#xff0c;与此同时&#xff0c;你的Protocol Buffer消息类型的需求也会随之变化。也就是说&#xff1a;有一些字段可能会发…

opengl如何画出一个球_少儿美术绘画教程:毛线球

小朋友们&#xff0c;你们平时画画有没有遇到过没有灵感的时候&#xff0c;面对画纸却不知道画些什么呢&#xff1f;今天我们来介绍一种创意思维&#xff0c;叫发散性思维。以一个毛线球为出发点。通过毛线球&#xff0c;我们可以想到圆球&#xff0c;通过圆球我们可以想到圆形…

数据结构---后序和中序遍历的二叉树序列还原二叉树

数据结构—后序和中序遍历的二叉树序列还原二叉树 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {char data;struct bstTree* lchild, *rchild; }bstTree; bstTree * reStoreTree(char* pre, int preSt, int preEnd, char *mi…

Asp.Net Core 混合全球化与本地化支持

前言最近的新型冠状病毒流行让很多人主动在家隔离&#xff0c;希望疫情能快点消退。武汉加油&#xff0c;中国必胜&#xff01;Asp.Net Core 提供了内置的网站国际化&#xff08;全球化与本地化&#xff09;支持&#xff0c;微软还内置了基于 resx 资源字符串的国际化服务组件。…

最大连续子数组和 动态规划_剑指Offer算法题 33:连续子数组的最大和

题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢&#xf…

数据结构---顺序查找和二分查找

数据结构—顺序查找和二分查找 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int n;//查找元素数组的长度 void seqCheckValue1(int* a) {//顺序查找1,有越界判断int v a[0];for (int i 1; i < n; i) {if(a[i…

git上托管的代码如何部署在阿里云上_居然仅用浏览器搞定Spring Boot应用的开发与部署...

最近有幸试用了一下阿里云的一个新产品&#xff1a;云开发平台&#xff0c;体验一把全新的开发模式&#xff01;虽然中间也碰到了一些问题&#xff0c;但整体的体验透露着未来感&#xff0c;因为整个过程都不需要使用我们最常用的IDEA&#xff0c;仅依靠浏览器就把一个Spring B…