我有用于存储文件的文件服务器。文件可能在此放置一周或一年。不幸的是,当我从服务器上删除文件时,df
命令无法反映释放的空间。因此,最终服务器已满(df
显示99%),并且我的脚本没有在该脚本上发送任何文件,除非那里可能有几十GB的可用空间。
noatime
如果有任何区别,我会在挂载的分区上得到标志。
我有用于存储文件的文件服务器。文件可能在此放置一周或一年。不幸的是,当我从服务器上删除文件时,df
命令无法反映释放的空间。因此,最终服务器已满(df
显示99%),并且我的脚本没有在该脚本上发送任何文件,除非那里可能有几十GB的可用空间。
noatime
如果有任何区别,我会在挂载的分区上得到标志。
Answers:
删除文件名实际上并不会删除文件。其他一些过程使文件保持打开状态,从而导致该文件不被删除;重新启动或终止该过程以释放文件。
采用
lsof +L1
找出哪个进程正在使用已删除(未链接)的文件。
正如Ignacio所说,删除文件将不会释放空间,直到您删除对该文件具有打开句柄的进程为止。
但是,您可以在不中断进程的情况下回收空间。您需要做的就是删除文件描述符。
首先执行lsof | grep删除以标识保存文件的进程
[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java 8859 hudson 1w REG 253,0 3662503356 7578206 /crucible/data/current/var/log/fisheye.out (deleted)
然后执行:
cd /proc/PID/fd
然后
[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb 7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)
“ 1”将是文件描述符。现在输入“> FD”以回收该空间
> 1
如果还有其他保存文件的进程,则可能需要重复该操作。
> FD
办?
>
命令有名字吗?我必须从zsh切换到bash才能使用它。可以在zsh上运行它吗?
通过打开文件的过程,文件仍然被锁定。要释放空间,请执行以下步骤:
运行sudo lsof | grep deleted
并查看哪个进程正在保存文件。结果示例:
$ sudo lsof | grep deleted
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted)
使用终止进程sudo kill -9 {PID}
。在上面的示例中,PID为1623。
$ sudo kill -9 1623
运行df
以检查是否已释放空间。如果仍然满了,也许您需要等待几秒钟,然后再次检查。
如果已将分区配置为仅保留磁盘空间的一部分以供root用户使用,df
则将不包括此空间。
[root@server]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/optvol 625G 607G 0 100% /opt
...
即使通过删除文件/目录来回收空间,非root用户也将无法写入特定分区。
您可以通过尝试以root用户和非root用户身份在设备上创建文件来轻松检查情况是否如此。
另外,您可以通过运行以下命令检查文件系统配置
tune2fs -l <device> | egrep "Block count|Reserved block count
并自行计算实际百分比。
要更改为仅供root用户使用而保留的磁盘%,请执行
tune2fs -m <percentage> <device>
其他答案是正确的:如果删除文件,但空间没有被释放,则通常是因为文件仍保持打开状态,或存在其他硬链接。
为了帮助进行故障排除,请使用一种工具来告诉您驱动器空间的使用位置:您可以du
用来获取空间使用情况的概述。更好的是,使用xdiskusage之类的图形工具(有很多这样的工具)来追查罪魁祸首。xdiskusage和朋友可以让您深入研究最大的太空猪,以找到空间的方向。
这样,您将迅速找到由于第二个硬链接而仍然占用空间的文件。它还将显示已删除但打开的文件所占用的空间(我相信,(因为权限未被允许),因为它无法读取文件名)。
我正在使用EXT2,在这种情况下FSCK帮助了我。立即尝试shudown -F,重新启动和fscks后,我看到一半的已用空间。