在Linux里面,你是不是也曾经天真的认为,只要使用rm去删除一个文件,那么这个文件所占用的空间就释放了?你要是这样认为,那事情就可能不如人意了

产生一个指定大小的随机内容文件

先看一下当前各个挂载目录的空间大小:

在这里挑选其中一个结果展示(选择任一挂载目录),接下来准备在/boot下生成一个文件。

我们首先产生一个50M大小的文件:

至此,就这样产生了一个50M大小的文件,再看boot下:

在这里你不用关心到底多了多少,你只需要关注,/boot下的文件增多了。

测试程序:

至于程序本身,也没干什么实际的事情,无非就是打开一个文件,然后一直循环。编译并运行:

打开另外一个窗口,删掉test.txt:

再看一下boot空间:

是不是很神奇,空间大小怎么一点都没变!!明明使用rm把它删除了啊?

我们把openFile程序停掉,再看看:

我滴个乖乖,空间马上就释放掉了,也就是按照预期,我们的文件被删除了。

一个文件什么情况下才会被删除?

然而,实际上,只有当一个文件的引用计数为0(包括硬链接数)的时候,才可能调用unlink删除,只要它不是0,那么就不会被删除。所谓的删除,也不过是文件名到 inode 的链接删除,只要不被重新写入新的数据,磁盘上的block数据块不会被删除,因此,你会看到,即便删库跑路了,某些数据还是可以恢复的。换句话说,当一个程序打开一个文件的时候(获取到文件描述符),它的引用计数会被+1,rm虽然看似删除了文件,实际上只是会将引用计数减1,但由于引用计数不为0,因此文件不会被删除。

关于里面的细节,还有很多内容(如硬链接数量也会影响文件是否被删除),这里不一一展开。

如何释放已经被删除文件占用的空间?

关于释放,前面已经说了,重启打开该文件的进程即可。但是有没有方法找到哪些文件被删除了,但还是被某些进程打开了呢?

自然是有方法的:

其中被标记为deleted的文件,就是这样的一些文件。

其实在前面的例子中,我们也可以很容易观察到(openFile程序运行,test.txt文件被删除):

看见没有,test.txt后面还有deleted字样。

既然我们都说了,这样的情况下文件是没有被删除的,那么还能不能恢复呢?实际上还是可以读取的。

总结

实际上对于这种文件被删除了,常常出现于程序的日志文件中,可能你有一个定时任务去清理程序产生的日志文件,但是如果程序本身忘记关闭句柄,就会导致磁盘空间得不到释放,最终就是你认为文件都被删除了,但是磁盘却依然被占着。所以,养成好习惯,打开文件后,不用时,记得关闭文件描述符。

如果发现明明已经删除了大量文件,但是空间却并没有恢复正常,那么不妨看看是不是还有程序打开了这些文件。

rm 空间不释放_面试官跟我说rm删除文件之后,空间就被释放了吗?我该怎么答...相关推荐

  1. java进程内存一直没释放_面试官:一个线程OOM,进程里其他线程还能运行么?...

    引言 这题是一个网友@大脸猫爱吃鱼给我的提问,出自今年校招美团三面的一个真题.大致如下 一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么? 先说一下答案,答案是还能运行 不瞒大家说, ...

  2. HDFS删除文件之后空间不释放,LINUX删除文件之后空间不释放

    删除文件之后空间不释放在我这遇到的情况主要有两种: 1.hdfs删除文件之后空间不释放 针对此种情况主要是hdfs的回收站功能,为了防止文件误删除,删除的文件会先放到回收站里. 删除的时候也可以直接彻 ...

  3. md5后得到的32位字符串存储到mysql中太占空间了_面试官:你对MySQL高性能优化有什么规范建议?...

    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? 文章篇幅较长,建议先收藏再找个合适的时间阅读 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 ...

  4. sqlserver2008未将对象引用设置到对象的实例_面试官:ThreadLocal 的内存泄漏是弱引用导致的,你确定?...

    面试官:ThreadLocal 了解吗? Python 小星:线程局部变量,多线程下能保证各个线程的变量相对独立于其他线程的变量. 面试官:那你说下它是如何保证线程隔离的? Python 小星:每个线 ...

  5. obj: object是什么意思_面试官问你JavaScript基本类型时他想知道什么?

    本文原载于SegmentFault专栏"前端小将" 整理编辑:SegmentFault 面试的时候我们经常会被问答js的数据类型.大部分情况我们会这样回答包括: 1.基本类型(值类 ...

  6. postman发送报文时请求时间超时因为什么_面试官说不要再问我三次握手和四次挥手是什么了...

    三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题.很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了. 见过比较典型的面试场景是这样的: ...

  7. jqgrid为什么表头和数据之间有间隙_面试官:你看过Redis数据结构底层实现吗?...

    面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...

  8. js var是什么类型_面试官问你JS基本类型时他想知道什么?

    点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 面试的时候我们经常会被问答js的数据类型.大部分情况我们会这样回答包括: 1.基本类型(值类型或者 ...

  9. redis删除过期key的算法_面试官别再问我Redis内存满了该怎么办了

    概述 Redis的文章,我之前写过一篇关于「Redis的缓存的三大问题」,累计阅读也快800了,对于还只有3k左右的粉丝量,能够达到这个阅读量,已经是比较难了. 这说明那篇文章写的还过得去,收到很多人 ...

最新文章

  1. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
  2. 肝!一个非常好用的 Python 魔法库
  3. 六、springcloud之配置中心Config
  4. D. Cut and Stick(Codeforces Round #716 (Div. 2))
  5. flowable实战(十五)关于流程设计器 bpmn.js与vue的整合
  6. 计算机网络课设不会,计算机网络课设讲述.doc
  7. react源码解析002 - 关于babelrc
  8. 转:开源项目学习方法ABC
  9. configure: error: C++ compiler cannot create executables
  10. 实用干货秘籍!最经典的10个Pandas数据查询案例,收藏!
  11. 关于Windows系统脚本(jscript)
  12. 让用户输入一个数,判断7的倍数
  13. maya绑定后的模型修改编辑技巧
  14. daimayuan每日一题#851 Good Permutations
  15. 关于阿里云香港Region可用区C服务中断事件的说明
  16. dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)
  17. rootless宁静机制_乘风破浪的姐姐 英文名决定了你的江湖地位!
  18. 利用python爬取百度翻译内容
  19. 程序员真人秀又来了!呼兰当主持挑灯狂补知识,SSS大佬本科竟是药学,清华朱军张敏等加入导师团...
  20. 一图更比六图强,图片滤镜--java

热门文章

  1. 这家公司不要求996,但照样市值万亿!
  2. 推荐一个好用的 Java 工具类库
  3. 每日一皮:据说这是很多公司的办事流程
  4. Uber 开源 Piranha,可自动删除过时代码
  5. Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
  6. 每日一问一周汇总:第1期
  7. 强力攻城狮的职位要求...
  8. 清华大学 唐杰 计算机学院 怎么样,我国首位原创虚拟学生,后期希望“她”能够像人一样进行创新...
  9. mysql的字段空格是null_MySQL中NULL与空字符串 空格问题
  10. conda Linux系统下的安装与使用