原因

有很多已删除文件被进程占用着。

这些被删除的文件是什么?

这些是命令使用的文件,如第一列所示,在我们的例子中是 rhn_check。
但是一旦这些步骤完成,这些文件作为命令过程的一部分被删除,但由于命令仍在执行,这些文件被锁定并且将处于相同状态,除非 PID 被释放或者命令被完全执行。

我们还可以使用以下命令查看这些已删除的文件

语法:

lsof +aL1 /file-system
# lsof +aL1 /var
COMMAND   PID     USER    FD   TYPE DEVICE      SIZE NLINK   NODE   NAME
rhn_check 31261    root    8u   REG  253,2   22082560 0 327733 /var/cache/yum/prod-03-epel-x86_64-server-5-rhel5/primary.xml.gz.sqlite (deleted)
rhn_check 31261    root    9u   REG  253,2      78848  0 327737 /var/cache/yum/prod-03-likewise-x86_64-client-5-rhel5/primary.xml.gz.sqlite (deleted)
rhn_check 31261    root   12u   REG  253,2    9275392  0 327752 /var/cache/yum/prod-03-rhel-x86_64-server-supplementary-5/primary.xml.gz.sqlite (deleted)
rhn_check 31261    root   13u   REG  253,2     582656  0 327756 /var/cache/yum/prod-03-rhn-tools-rhel-x86_64-server-5-rhel5/primary.xml.gz.sqlite (deleted)
rhn_check 31261    root   14u   REG  253,2   34002944  0 327758 /var/cache/yum/prod-03-epel-x86_64-server-5-rhel5/filelists.xml.gz.sqlite (deleted)
rhn_check 31261    root   15u   REG  253,2   33857536  0 327760 /var/cache/yum/prod-03-epel-x86_64-server-5-rhel5/other.xml.gz.sqlite (deleted)

检查被删除文件锁定的总大小

# lsof /var | gawk -F" " '{ print }' |sort| uniq| awk '{ sum += } END { print sum/(1024*1024*1024) }'
0.937209

可以看到 大约 0.94 GB 大小的文件被锁定。
这就是 du 和 df 命令之间大小有差别的原因。

还可以这样查看

# lsof +aL1 /var | awk -F " " '{print }' | sort | uniq | awk '{ sum += } END { print sum/(1024*1024*1024*1024) }'
0.937209

解决方案:

让我们检查这个 PID 使用的其他文件(我已经修剪了 o/p,因为它很长)

# lsof -p 31261

rhn_check 31261 root  mem    REG              253,0    143144    557343 /lib64/libexpat.so.0.5.0
rhn_check 31261 root  mem    REG              253,0    372912    950724 /usr/lib64/python2.4/site-packages/M2Crypto/__m2crypto.so
rhn_check 31261 root  mem    REG              253,0      7120    918933 /usr/lib64/python2.4/lib-dynload/_weakref.so
rhn_check 31261 root  mem    REG              253,0     34184    919549 /usr/lib64/python2.4/site-packages/_sqlite.so
rhn_check 31261 root  mem    REG              253,0     41784    919601 /usr/lib64/python2.4/site-packages/_sqlitecache.so
rhn_check 31261 root  mem    REG              253,0    647608    557099 /lib64/libglib-2.0.so.0.1200.3
rhn_check 31261 root    5r   REG              253,0     19517    920332 /usr/share/rhn/actions/packages.py
rhn_check 31261 root    6u  unix 0xffff8106770ba980           901384670 socket
rhn_check 31261 root    7w   REG              253,2       107     32851 /var/log/yum.log

如我们所见,还有许多其他文件仍在使用中,并且命令 rhn_check 似乎仍在执行。
现在,此时我们需要决定空间是重要的还是正在执行的服务/命令。
因为如果你继续杀死那个 PID,那么负责这个 PID 的服务就会死掉,影响你的应用程序和使用。

在我的情况下,rhn_check 命令在这个时间点不是很重要,所以我可以继续杀死它

# kill -9 31261
$df -h /var/
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-var
3.9G  3.0G  703M  82% /var

此问题的另一个更好的选择是重新启动所需的服务。
例如,如果任何服务(如 named、httpd 等)锁定了任何已删除的文件,则最好重新启动该服务。
这样所有锁定的删除文件都将被释放。
因此,与其杀死 PID,这可能是一个更好的选择。

即使磁盘上有空间,df 也显示分区使用率已经 100%

使用df -h查看文件系统使用率时,显示100%

# df -h /var/
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-var
3.9G  3.9G     0 100% /var

使用du检查大小时,却只占用3.9G中的2.9G,使用率只有80%

[root@server1 var]# du -sh
2.9G    .

检查使用 /var的进程,可以使用 lsof 命令

# lsof /var
日期:2020-06-02 22:16:50 来源:oir作者:oir