linux删除文件没有释放空间

说明:
今天公司的一台服务器报/使用超过90%,删除了apache的error_log(有3G多。。。这是合作方服务器,环境他们自己部署的,放着那么大的/data盘不用。。。)日志,df看磁盘空间还是没有释放。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  2.8G  4.7G  91% /
/dev/xvdb1            178G  601M  168G   1% /data
/dev/xvdd1            7.9G  597M  6.9G   8% /usr/local
tmpfs                 1.7G  4.0K  1.7G   1% /dev/shm

 
但du -h –max-depth=1 /看/根目录也只有3.5G。。。那刚刚删除的3G多怎么没释放

# du -h --max-depth=1 /
0	/proc
312M	/tmp
...
72K	/lost+found
80M	/root
760M	/opt
4.0K	/cgroup
27M	/lib64
31M	/boot
3.5G	/

上网搜了下发现是因为在linux上被删除的文件仍被其他进程所使用,文件句柄没有完全释放出来,导致空间无法释放出来。
在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被
打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。而我删除的是oracle的告警log文件
删除的时候文件应该正在被使用

解决:
一、通过lsof |grep deleted查看被占用文件

# lsof |grep deleted  //大家大概看一下哈,当初弄的时候忘记复制了。。。
apache    23492  apache    6w      REG              253,0 16749822091     215748 /opt/lamp/apache2/logs/error_log (deleted)
apache    23492  apache    7u      REG              253,0           0      36282 /opt/lamp/apache2/logs/error_log (deleted)
apache    23492  apache    8w      REG              253,0 16749822091     215748 /opt/lamp/apache2/logs/error_log (deleted)
apache    23494  apache   10u      REG              253,0           0      36307 /opt/lamp/apache2/logs/error_log (deleted)

从输出结果可以看到/opt/lamp/apache2/logs/error_log 还被使用,未被释放空间

二、释放被占用文件磁盘空间
如何让进程释放呢,有2种方法:一种是kill掉相应的进程;另一种则是停掉使用这个文件的应用,让os自动回收磁盘空间
我这个环境有很多进程在使用这个文件,停掉进程有点麻烦,再有就是风险很大
1.关于kill掉相应的进程的办法
当linux打开一个文件的时候,Linux内核会为每一个进程在/proc/ 『/proc/nnnn/fd/目录(nnnn为pid)』建立一个以其pid
为名的目录用来保存进程的相关信息,而其子目录fd保存的是该进程打开的所有文件的fd(fd:file descriptor)。
kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。这是一项高级技术,仅到管理员确定不会对运行中的进程造成影响时使用。应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题

2.所以我还是采用停应用来解决
# /opt/lamp/apache2/bin/apachectl graceful //修改了apache的日志文件位置后,优雅地重启下服务。重启后发现/opt/lamp/apache2/logs/error_log对应的空间被释放

再查看磁盘空间的使用情况,发现空间已经回收了

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  2.8G  4.7G  38% /
/dev/xvdb1            178G  601M  168G   1% /data
/dev/xvdd1            7.9G  597M  6.9G   8% /usr/local
tmpfs                 1.7G  4.0K  1.7G   1% /dev/shm

发表评论

邮箱地址不会被公开。 必填项已用*标注