具体的原理为: 当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。
下面的 demo 演示如何恢复被误删的文件。
# 模拟生成一个日志文件 [Mon Jan 22 10:02:53 root@localhost ~ ]# for i in {1..100}; do echo "INFO: $(date +%s) This is the first log $i" >> /root/123.log ;done # 通过more 命令来实现后台进程调用 more /root/123.log # 打开后按ctrl + z 把任务放到后台执行,然后通过lsof查看一下进程打开文件情况 [Mon Jan 22 10:14:09 root@localhost ~ ]# lsof 123.log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME more 37726 root 3r REG 253,0 4192 33575036 123.log # 模拟误删文件 [Mon Jan 22 10:16:46 root@localhost ~ ]# rm -f 123.log [Mon Jan 22 10:17:48 root@localhost ~ ]# lsof -u root | grep '123.log' more 37726 root 3r REG 253,0 4192 33575036 /root/123.log (deleted) # 开始进行恢复 [Mon Jan 22 10:19:30 root@localhost ~ ]# cat /proc/37726/fd/3 > /root/123.log [Mon Jan 22 10:19:40 root@localhost ~ ]# cat /root/123.log | head INFO: 1705888970 This is the first log 1 INFO: 1705888970 This is the first log 2 INFO: 1705888970 This is the first log 3 INFO: 1705888970 This is the first log 4 INFO: 1705888970 This is the first log 5 INFO: 1705888970 This is the first log 6 INFO: 1705888970 This is the first log 7 INFO: 1705888970 This is the first log 8 INFO: 1705888970 This is the first log 9 INFO: 1705888970 This is the first log 10
注:这里是模拟环境,如果实际工作中,还原文件后还要注意文件权限以及重启进程才能生效
标签:INFO,文件,log,误删,Linux,1705888970,root,first From: https://www.cnblogs.com/HByang/p/17979426