IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux下删除正在写入的文件会发生什么? -> 正文阅读

[系统运维]Linux下删除正在写入的文件会发生什么?

一、问题的提出??? ? ?

某天,我启动了一个进程,向一个文件a.txt中写入内容,但不小心在另一个窗口用命令rm -f a.txt把它删除了,我以为这应该会触发一个警告,比如“不能删除一个打开的正在写入的文件”之类的,结果命令干脆的执行成功了,更出乎预料的是,我回到之前的那个窗口,我发现进程还在正常的写入数据,程序并没有报出任何异常,并打印出了一批批成功写入的日志。

二、问题的解释 ? ? ? ?

这就有点让我费解了,伟大的好奇心让我寻找答案。原来Linux中真正表示一个文件的是一个叫inode的数据结构,而文件名只是指向了inode(自然能够想到可以有多个文件名指向同一个inode,这就是文件系统中的硬连接)。用rm -f a.txt这样的命令删除文件,其实是删除了文件名到inode之前的连接关系,那么直接表示文件内容的inode是什么时候删除的呢?答案是文件系统判断如果所有由文件名指向inode的关系都被删除的时候,就把inode删除掉。

????????那似乎还是说不通,我上面并没有给a.txt建立硬链接,也就是a.txt的inode应该马上被删除,inode都没有了,写入进程应该报错才是啊,最后我通过查看教学版操作系统xv6的源码,发现其实文件系统在回收inode时,除了判断到inode的链接数为0,还要判断到inode的引用数为0,当一个进程打开一个文件时,它的inode的引用数就会加1,所以这里虽然链接数为0但引用数为1,文件系统还是不会删除inode,那么什么时候删除inode呢,答案是进程结束时引用数归0时。这也是为什么,有时我们将一个文件删除了,但是用du命令查看空间并没有被释放,重启程序空间就释放了的原因。

三、引申问题1

那么问题来了,如果我这个进程持续的写入,这些写入的内容会占用磁盘空间吗?
实践出真知,我们做一个小实验,在vmware中加一块小硬盘,空间为50M(vmware以G为单位,写0.05G),这样可以比较容易的模拟出磁盘写满的情形。通过fdisk命令进行分区

使用mkfs命令进行格式化,然后mount命令将其挂载到/test

mkfs -t ext3 /dev/sdb1
mkdir /test
mount /dev/sdb1 /test


准备工作完毕!
这样,我们就得到了一个空间只有大概50M的文件夹,进入/test目录,写个简单的python脚本向a.txt文件写入内容:

import time
fd = open("a.txt", "wb")
time.sleep(3)
while True:
    try:
        fd.write("xxx")
        fd.flush()
    except Exception,e:
        print(e)
        break

time.sleep(1000)
fd.close()

稍微解释一下代码:
在打开文件后,写入文件前sleep 5秒,这样可以让我们从容的启动另一个窗口,将a.txt删除,造成写入一个“不存在文件” 的情形。中间那个异常的捕获,是为了当磁盘写满时跳出循环,让程序休眠,否则它会退出(进程结束,空间就会被释放,观察不到实验现象了)

正式开始,python a.py启动程序,快速打开另一个窗口,rm -f a.txt删除文件,切换回之前窗口,静静的观察即将发生的一切。结果不出预料,磁盘很快被写满,程序打印出“[Errno 28] No space left on device”(注意这时进程并没有结束,而是被sleep冻住了)

?

?这时我们观察一下磁盘的使用情况,会发现磁盘确实被占满了

?我们也可以写入一个文件验证一下,同样报错:

?但是如果我们用du命令看,会发现/test的空间只有16k,这说明du命令并没有统计这种inode没有删除的文件

四、引申问题2

另外一个问题,这时我们能从哪里看到这个文件呢,因为我们已经无法通过之前的路径的方式了,其实还是可以的,因为操作系统会将进程打开的文件描述符放到/proc/{pid}/fd目录下,我们可以在这里看到这个文件的内容

五、引申问题3

还有一个问题,是否我们可以通过将一个文件名链接到这个inode的方式重新“找回”这个文件呢?答案似乎是不可以,因为这样是绕过了文件系统的权限机制,操作系统不允许。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:18:21  更:2021-11-27 10:18:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:37:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码