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
注:这里是模拟环境,如果实际工作中,还原文件后还要注意文件权限以及重启进程才能生效
分类:
Linux系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」