服务器删除文件后磁盘空间没有立刻释放问题

服务器删除文件后磁盘空间没有立刻释放问题

业务场景:发现一台服务器的磁盘空间不足,需要进行处理,登录后发现磁盘使用率已经100%,操作删除了一些文件和日志信息后,查看空间仍然没有变化。

一、现象描述

操作系统:CentOS 6.8 x64

使用 df -h 命令,看见 / 根目录下磁盘空间已满(100%),于是手动清理大日志文件。

\1. [root@local ~]# df -h

\2. Filesystem          Size Used Avail Use% Mounted on

\3. /dev/mapper/rootvg-LogVol00  59G  59G   0 100% /

\4. /dev/sda1           190M  13M 168M  8% /boot

\5. tmpfs             2.0G   0 2.0G  0% /dev/shm

通过 du -sh 命令,找到占用大量空间的日志文件,于是使用 rm -rf 删除了它。

\1. [root@local ~]# cd /var/nginx/logs/

\2. [root@local ~]# rm -rf t-access.log t-error.log

然后 查看磁盘空间的使用情况,发现 / (根目录)的空间并没有发生变化

\1. [root@local ~]# df -h

\2. Filesystem          Size Used Avail Use% Mounted on

\3. /dev/mapper/rootvg-LogVol00  59G  56G   0 100% /

\4. /dev/sda1           190M  13M 168M  8% /boot

\5. tmpfs             2.0G   0 2.0G  0% /dev/shm

这是怎么回事呢?

二、原因分析

未释放磁盘空间的原因:

在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink),然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是nginx的访问日志文件,在删除的时候该文件正在被使用。

三、解决办法

首先获得一个已经被删除的可是仍然被应用程序占用的文件列表。操作如下:

\1. [root@local ~]# lsof |grep deleted

\2. nginx    4399   root  38w   REG        253,0  19304448  10835682 /var/nginx/logs/t-access.log (deleted)

\3. nginx    4399   root  39w   REG        253,0  3502080  10835684 /var/nginx/logs/t-error.log (deleted)

\4. nginx    4401  nobody  38w   REG        253,0  19304448  10835682 /var/nginx/logs/t-access.log (deleted)

\5. nginx    4401  nobody  39w   REG        253,0  3502080  10835684 /var/nginx/logs/t-error.log (deleted)

\6. nginx    4402  nobody  38w   REG        253,0  19304448  10835682 /var/nginx/logs/t-access.log (deleted)

\7. nginx    4402  nobody  39w   REG        253,0  3502080  10835684 /var/nginx/logs/t-error.log (deleted)

\8. nginx    4403  nobody  38w   REG        253,0  19304448  10835682 /var/nginx/logs/t-access.log (deleted)

\9. nginx    4403  nobody  39w   REG        253,0  3502080  10835684 /var/nginx/logs/t-error.log (deleted)

\10. nginx    4404  nobody  38w   REG        253,0  19304448  10835682 /var/nginx/logs/t-access.log (deleted)

\11. nginx    4404  nobody  39w   REG        253,0  3502080  10835684 /var/nginx/logs/t-error.log (deleted)

从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使用中,所以导致未释放空间。

那么如何让进程释放呢?

方法1:直接 kill 掉相应的进程,或者停掉使用这个文件的应用,让操作系统自己主动回收磁盘空间。

由于还有其他项目正在使用该应用(nginx服务),所以不能停掉nginx服务,于是使用 kill 命令删除相应的进程。

\1. [root@local ~]# kill -9 4399

\2. [root@local ~]# kill -9 4401

\3. [root@local ~]# kill -9 4402

\4. [root@local ~]# kill -9 4403

\5. [root@local ~]# kill -9 4404

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

\1. [root@local ~]# df -h

\2. Filesystem          Size Used Avail Use% Mounted on

\3. /dev/mapper/rootvg-LogVol00  59G  56G   0 95% /

\4. /dev/sda1           190M  13M 168M  8% /boot

\5. tmpfs             2.0G   0 2.0G  0% /dev/shm

方法2:以后清理正在被读写的大日志文件时,直接使用 echo “” > xxx.log 命令,即直接将文件置空,并不影响服务的使用,文件大小也被控制下来,磁盘空间也释放了。

猜你喜欢

转载自blog.csdn.net/itScholar001/article/details/131003852