赞
踩
某一天,程序写日志把磁盘给写满了。原因一是程序有死循环,写日志太多了;二是即使用rm把文件删掉了,也没释放空间。
要说的就是第二个原因,算是又学习到一个新的东西。
我们来简单重现下:
1、写一个test
- <?php
- $a = '111';
- $f = fopen('1.txt', 'a+');
- while(1){
- fwrite($f, $a);
- sleep(1);
- }
执行这个程序,它会在本地产生一个1.txt文件,且会一直往里面写。
2、使用ps命令查看,会有进程
8214 8184 0 21:43 pts/0 00:00:00 php test.php
3、我们把1.txt文件删除,会发现8214这个进程还存在
4、使用lsof -p 8214命令查看其打开的文件,在最后一行会看见
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还在不断上升,为什么呢?
这是因为:当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
5、只能删掉该进程
当然,现在写日志都是按时间来新建文件的,而不是一直往一个文件里写。所以,一般也不会出现这种情况。
参考:(lsof命令详解)http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html
http://blog.163.com/aprilthirty60@126/blog/static/88613578201282703952163/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。