linux下删除文件,空间不释放

14年9月写在csdn上

某一天,程序写日志把磁盘给写满了。原因一是程序有死循环,写日志太多了;二是即使用rm把文件删掉了,也没释放空间。

要讨论的就是第二个原因。

我们来简单重现下:

1,写一个test

1
2
3
4
5
6
7
<?php
$a = '111';
$f = fopen('1.txt', 'a+');
while(1){
fwrite($f, $a);
sleep(1);
}

执行这个程序,它会在本地产生一个1.txt文件,且会一直往里面写。

2,使用ps命令查看,会有进程

1
8214  8184  0 21:43 pts/0    00:00:00 php test.php

3,我们把1.txt文件删除,会发现8214这个进程还存在

4, 使用lsof -p 8214命令查看其打开的文件,在最后一行会看见:

1
2
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
php 8214 xxxxx 3u REG 202,1 1896 248330 /home/xxxxx/1.txt (deleted)

发现其还在写入,SIZE还在不断上升,why?

这是因为:

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

5,只能删掉该进程

当然,现在写日志都是按时间来新建文件的,而不是一直往一个文件里写。所以,一般也不会出现这种情况。

参考: (lsof命令详解)http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html

http://blog.163.com/aprilthirty60@126/blog/static/88613578201282703952163/