利用文件(占用进程)描述符恢复误删的文件

(ps:即该文件在启动时会被进程调用,或者有进程调用该文件。例如:某服务在执行时都会写日志文件,而日志文件就会被一些进程调用用于记录日志。)

现在我们模拟文件(占用进程)被误删的状态:

[[email protected] ~]# echo 123123 > a.txt
[[email protected] ~]# cat a.txt
123123
[[email protected] ~]# tail -f a.txt 
123123

(使用tail -f 一直监控该文件,这样当前文件就会有一个进程。)

另起一个窗口,删除该文件

[[email protected]~]# rm -f a.txt 
[[email protected] ~]# ls|grep a.txt

现在已经确认该文件被删除。

然后我们找回该文件

[[email protected] ~]# ps -ef|grep tail
root       1674   1174 0 03:29 pts/1    00:00:00 tail -fa.txt
root       1719   1633 0 03:38 pts/2    00:00:00 grep--color=auto tail
[[email protected] ~]# lsof|grep delete
bash      1174    root   6w      REG                8,3        9     34549 /root/a.txt (deleted)
tail      1674    root   6w      REG                8,3        9     34549 /root/a.txt (deleted)
tail      1674    root   7r      REG                8,3        7      4066 /root/a.txt (deleted)
[[email protected] ~]# cat /proc/1674/fd/7
123123

这样,我们就找到了删除的文件内容,然后只要复制粘贴到文件中,就ok了。

查找位置就是/proc/内tail的进程号1674的目录里的fd(文件描述符文件夹)里的7(文件描述符号),即/proc/1674/fd/7文件就是该进程调用刚才创建文件的内容,这样就找回了刚才误删的文件内容。

时间: 2024-10-14 12:11:11

利用文件(占用进程)描述符恢复误删的文件的相关文章

进程与进程描述符(task_struct)

一. 进程 进程(Process) 计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. --------------------------------------------------------------- 释义:一段程序的执行过程 特征:动态.独立.异步.并发 结构特征

进程管理—进程描述符(task_struct)

http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息. 内核当中使用进程描述符task_struct. 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理. 接下来我们

进程描述符task_struct

1.进程状态 [cpp] view plain copy volatile long state; int exit_state; state成员的可能取值如下: [cpp] view plain copy #define TASK_RUNNING        0 #define TASK_INTERRUPTIBLE  1 #define TASK_UNINTERRUPTIBLE    2 #define __TASK_STOPPED      4 #define __TASK_TRACED 

Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_struct结构体,可以说她是linux内核源码中最复杂的一个结构体了,成员之多,占用内存之大. 进程状态 /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task_state().

Linux 进程描述符 task struct

大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进程描述符,具体是task_struct结构体存储相关的信息,在linux/sched.h文件里定义,那么我们先看看linux内核3.0版本的task_struct结构体的定义吧(删除了不必要的字段,只保留了重要的字段).同时欢迎大家转载和交流. struct task_struct {       //这个是进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止.  volatile longstate;  

进程—进程描述符展开

进程-从进程描述符展开(一) 进程内核栈结构:union task_union 在../include/linux/sched.h中定义了如下一个联合结构用来创建内核栈空间. //../include/linux/sched.h union task_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }: 线程描述符:struct thread_info 每一个进程都有一个

Linux报错-bash: fork: retry: Resource temporarily unavailable和进程描述符之间的关系

在公司服务器上切换用户,出现 "-bash: fork: retry: Resource temporarily unavailable"这样的报错,查询得知是普通用户能够使用的进程数太少和文件描述符太小导致的,每一个文件描述符会和一个文件对应,但是很多文件描述符也会和一个文件对应.相同的文件可以被不同的进程打开,也可以被同一个进程打开多次.我们可以从系统层面和进程层面来查看相应的文件描述符. 一,系统层面的文件描述符 涉及到系统层面的,基本上都是通过修改内核参数来实现的,修改系统中的

外部碎片、进程描述符、内部碎片

外部碎片: 是由于用户进程向内存频繁申请和释放内存空间所产出的空闲内存容量.伙伴算法解决的就是这个问题,解决的方法其实就是有伙伴算法的算法设计方法来决定,比如伙伴算法中的合并和切割方式,不够则申请大的空间,但会先切割后再分配出去,剩余的有可能因伙伴关系合并,并成更大的空闲空间,这是一种解决碎片的方式,另一种方式是释放时,也会因为释放后的空闲空间有可能形成伙伴而继续合并,这样就将零零碎碎的空闲空间内存慢慢合并成大的空闲空间,事外部碎片尽量减少. 进程描述符: 即task_struct进程结构体,每

Linux下利用文件描述符恢复的成功失败实验

1.测试环境准备[[email protected] ~]$ uname -aLinux redhat3 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux[[email protected] ~]$ sqlplus / as sysdbaset pagesize 999 SQL*Plus: Release 11.2.0.4.0 Production on Fri Mar