Linux 文件被进程调用情况下误删文件修复

  具体的原理为: 当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

  进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。

  下面的 demo 演示如何恢复被误删的文件。

复制代码
# 模拟生成一个日志文件
[Tue Jan 23 11:14:15 root@localhost ~ ]# for i in {1..100}; do echo "INFO: $(date +%s) This is the $i log" >> /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
[Tue Jan 23 11:14:15 root@localhost ~ ]# cat 123.log | head
INFO: 1705979651 This is the 1 log
INFO: 1705979651 This is the 2 log
INFO: 1705979651 This is the 3 log
INFO: 1705979651 This is the 4 log
INFO: 1705979651 This is the 5 log
INFO: 1705979651 This is the 6 log
INFO: 1705979651 This is the 7 log
INFO: 1705979651 This is the 8 log
INFO: 1705979651 This is the 9 log
INFO: 1705979651 This is the 10 log
复制代码

注:这里是模拟环境,如果实际工作中,还原文件后还要注意文件权限以及重启进程才能生效

posted @   杨灏  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示