说明:
今天公司的一台服务器报/使用超过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