linux中在进程尚未停止前恢复被误删的文件

背景介绍:

今天,在运维群里面跟一些群友聊天,我主要吐槽了关于EXT4文件系统难以做数据恢复的问题,因为过去自己有尝试过EXT3和EXT4上的数据恢复,主要用的是ext3grep和ext4undelete,EXT3基本上每次都能恢复成功,但EXT4却没有成功过一次,每次恢复出来的文件都是破损的,或残缺不全的。

期间,一些比较资深的牛人说EXT4他们成功的恢复过,并且说抱怨Linux文件系统数据不好恢复的人都是对Linux文件系统的基础知识不熟悉,多去看看Linux文件系统关于block, inode, superblock的知识,对于删除文件就是另外的认识了。

听到之后很是惭愧,的确过去只是停留在工具层面,没有深入了解这些方面的知识。

然后,我提到了一个场景,就是某个进程在运行过程中一直在打印一个日志,这时候,有人误删了这个日志。群友说这种情况下恢复文件是非常简单的,因为文件其实还存在于系统当中,不过必须要让进程保持在运行状态,一旦停止或重启后,文件就消失了。

相信大家都有过类似的经验,在清理空间的时候,虽然删掉了一些大的日志文件,但是空间并没有得到释放,而是必须要等到重启服务或杀掉进程的时候才会。

于是我简单的搜索了一下,找到了这篇文章:http://unix.stackexchange.com/questions/101237/how-to-recover-files-i-deleted-now-by-running-rm

并且通过ping命令打印日志并删除日志来成功模拟了这样一个场景。

具体步骤如下:

[dong@idc1-dong1 ~]$ ping 111cn.net &> ping.output.log &
[1] 22672

[dong@idc1-dong1 ~]$ tail -n 5 ping.output.log
64 bytes from 54.238.131.140: icmp_seq=14 ttl=47 time=176 ms
64 bytes from 54.238.131.140: icmp_seq=15 ttl=47 time=126 ms
64 bytes from 54.238.131.140: icmp_seq=16 ttl=47 time=205 ms
64 bytes from 54.238.131.140: icmp_seq=17 ttl=47 time=121 ms
64 bytes from 54.238.131.140: icmp_seq=18 ttl=47 time=121 ms

[dong@idc1-dong1 ~]$ rm -f ping.output.log
[dong@idc1-dong1 ~]$ ls ping.output.log
ls: cannot access ping.output.log: No such file or directory

[dong@idc1-dong1 ~]$ sudo lsof | grep ping.output
ping 22672 dong 1w REG 253,0 2666 2016 /home/dong/ping.output.log (deleted)
ping 22672 dong 2w REG 253,0 2666 2016 /home/dong/ping.output.log (deleted)

[dong@idc1-dong1 ~]$ sudo -i
[root@idc1-dong1 ~]# cd /proc/22672/fd

[root@idc1-dong1 fd]# ll
total 0
lrwx------ 1 root root 64 Sep  1 11:23 0 -> /dev/pts/0
l-wx------ 1 root root 64 Sep  1 11:23 1 -> /home/dong/ping.output.log (deleted)
l-wx------ 1 root root 64 Sep  1 11:23 2 -> /home/dong/ping.output.log (deleted)
lrwx------ 1 root root 64 Sep  1 11:23 3 -> socket:[26968949]

[root@idc1-dong1 fd]# tail -n 5 1
64 bytes from 54.238.131.140: icmp_seq=119 ttl=47 time=161 ms
64 bytes from 54.238.131.140: icmp_seq=120 ttl=47 time=125 ms
64 bytes from 54.238.131.140: icmp_seq=121 ttl=47 time=198 ms
64 bytes from 54.238.131.140: icmp_seq=122 ttl=47 time=151 ms
64 bytes from 54.238.131.140: icmp_seq=123 ttl=47 time=135 ms
[root@idc1-dong1 fd]# tail -n 5 2
64 bytes from 54.238.131.140: icmp_seq=121 ttl=47 time=198 ms
64 bytes from 54.238.131.140: icmp_seq=122 ttl=47 time=151 ms
64 bytes from 54.238.131.140: icmp_seq=123 ttl=47 time=135 ms
64 bytes from 54.238.131.140: icmp_seq=124 ttl=47 time=135 ms
64 bytes from 54.238.131.140: icmp_seq=125 ttl=47 time=134 ms

[root@idc1-dong1 fd]# cp 1 /root/ping.output.log.recover

[root@idc1-dong1 fd]# cd
[root@idc1-dong1 ~]# head -n 5 ping.output.log.recover
PING 111cn.net (54.238.131.140) 56(84) bytes of data.
64 bytes from 54.238.131.140: icmp_seq=1 ttl=47 time=227 ms
64 bytes from 54.238.131.140: icmp_seq=2 ttl=47 time=196 ms
64 bytes from 54.238.131.140: icmp_seq=3 ttl=47 time=157 ms
64 bytes from 54.238.131.140: icmp_seq=4 ttl=47 time=235 ms
[root@idc1-dong1 ~]# tail -n 5 ping.output.log.recover
64 bytes from 54.238.131.140: icmp_seq=146 ttl=47 time=172 ms
64 bytes from 54.238.131.140: icmp_seq=147 ttl=47 time=132 ms
64 bytes from 54.238.131.140: icmp_seq=148 ttl=47 time=212 ms
64 bytes from 54.238.131.140: icmp_seq=149 ttl=47 time=172 ms
64 bytes from 54.238.131.140: icmp_seq=150 ttl=47 time=132 ms

[root@idc1-dong1 ~]# pkill -kill -f ping
[root@idc1-dong1 ~]# cd /proc/22672/fd
-bash: cd: /proc/22672/fd: No such file or directory

时间: 2024-11-20 19:46:26

linux中在进程尚未停止前恢复被误删的文件的相关文章

linux中主进程与主线程的关系

问题描述 linux中主进程与主线程的关系 一直很困惑,linux环境下,程序启动时,会有主线程吗?如果有,这个主线程是在什么时候生成的,主进程又是什么时候生成的呢? 谢谢各位大大赐教! 解决方案 主线程和主进程是相对而言的,主函数里面fork了子进程那么主函数就是主进程.类似的,pthread_create了子线程,主函数就是主线程. 解决方案二: 进程启动的时候会有一个主线程,来执行Init初始化,调用_main() 函数等,这个线程就是主线程. 这个主进程概念是类似当它启动了子进程以后,那

Linux中用于进程显示的top命令使用实例集锦

  Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运行很多命令.我们也会探索这些命令.(注:不同发行版的top命令在各种细节有不同,如果发现不同时,请读你的帮助手册和命令内的帮助.) 1. Top 命令输出: 首先,让我们了解一下输出.top命令会显示系统的很多信息.我们需要理解不同部分输出的意义:默认运行时,top命令会显示如下输出: (默认显

Linux中查看进程及杀死进程命令

Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx'  3405 ?        00:00:00 fcitx <defunct>  3415 ?        00:00:02 fcitx   不显示标题 root@www.linuxidc.com:/home/zhangbin# ps -h Warning: bad ps syntax, perhaps a bogus '-'

Linux中查看进程占用内存的情况【转】

转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将其中的[pid]替换成相应进程的PID号: cat /proc/[pid]/status 说明 /proc/[pid]/status中所保存的信息除了内存信息,还包括进程IDs.信号等信息,此处暂时只介绍内存相关的信息. 字段 说明 VmPeak 进程所使用的虚拟内存的峰值 VmSize 进程当前使

Linux中用于进程控制的exec函数族

1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., cha

linux中php-fpm进程数优化与分析详解

在几个不是很繁忙的线上服务器发现php-fpm进程数达到500多,且存在一些运行时间长达几个月的进程. 进行了以下排查,以确定:phpfpm运行是否有问题,是否需要重启. 查看这些进程是否被正常启动 由于php-fpm.log中,会以notice级别打印worker进程的启动和回收时间,故可以通过以下语句检查有哪些php没有被记录到(ps axuf可以查看到进程的父子关系):  代码如下 复制代码 $cd /path/to/php-fpm.log $for word in `ps axu | g

Linux中Kill进程的N种方法

常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal smx       1823  1822  0 11:38 ?        00:00:00 gnome-pty-helper smx       1824  1822  0 11:38 pts/0    00:00:02 bash smx       1827     1  4 11:38 ?    

C语言的fork函数在Linux中的进程操作及相关面试题讲解_C 语言

fork的意义 下图为,C 程序的存储空间布局(典型) 1.一个现有进程可以调用 fork 函数创建一个新进程. 2.fork 函数被调用一次,但返回两次, 两次返回的唯一区别是子进程的返回值是 0, 而父进程的返回值是新子进程的 PID. 3.子进程和父进程继续执行 fork 调用之后的指令. 在上图的存储空间布局中,父子进程只共享正文段,其余的都各自有独立的副本 (通常使用 copy-on-write 的策略,速度比较快). fork 的两种用法 1.父子进程同时执行不同的代码段典型应用:W

linux中ubuntu进程查看和结束命令

情况说明 由于操作不当,在终端启动的 django 程序 python manage.py runserver 没有关闭(端口为8000), 再次在终端启动时,出现错误: Error: That port is already in use. 现在找到原来的进程并杀掉此进程 解决办法 1.sudo netstat -antup 激活Internet连接 (服务器和已建立连接的)  代码如下 复制代码 Proto Recv-Q Send-Q Local Address           Fore