我有用于存储文件的文件服务器。文件可能在此放置一周或一年。不幸的是,当我从服务器删除文件时,df命令无法反映释放的空间。因此,最终服务器被装满(df显示99%),并且我的脚本不再向其中发送任何文件,除非那里可能有几十GB的可用空间。

如果有任何区别,我在安装的分区上得到了noatime标志。

评论

这是在单个分区上还是在所有分区上发生?

好吧,它发生在我主要的数据分区上,这是我唯一关心的分区,因为我只在上面写/删除文件。

请通过解决方案或它的链接启发我。

什么文件系统? DF执行了超级块的统计,可能是您的文件系统没有更新sb inode。您是否尝试过刷新缓存?

使用ext4。您如何刷新缓存?

#1 楼

删除文件名实际上并不会删除文件。其他一些过程使文件保持打开状态,从而导致该文件不被删除;重新启动或终止该进程以释放文件。

使用

lsof +L1


找出哪个进程正在使用已删除(未链接)的文件。

评论


一个月以来没有访问过被删除的文件,唯一访问它们的进程是nginx,因此值得怀疑。

–user11350
2011-2-8在8:08

+1。另外,“ lsof + L1”将告诉您哪个程序正在打开文件。

–小时
2011年2月8日在8:10

以root用户身份运行“ lsof -n | grep文件”,您会惊讶于由于各种原因使文件保持打开状态的文件会停留多长时间。如果所有其他方法均失败,请重新启动,建议您这样做很不好,但它肯定会确保文件上没有任何内容。每秒钟,lsof + L1可能是更好的方法。

– ScottZ
2011-2-8在8:11



你救了我!删除了93G日志文件,但没有收回空间,也无法找出原因。谢谢。

–卢克·考辛斯(Luke Cousins)
14年4月16日在14:14

同样,如果这对其他人有帮助,我擦除了一个较大的nginx access.log文件,但仅在重启nginx之后才能够回收该空间:service nginx restart

–尼克
14年6月20日在12:47

#2 楼

正如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有什么作用?

–filBot3
15年7月6日在13:19

它删除文件描述符

–AdriánDeccico
2015年7月13日,1:12

这个>命令有名字​​吗?我必须从zsh切换到bash才能使用它。可以在zsh上运行它吗?

– ariera
15年11月13日在17:35

它是输出重定向,因此会截断文件。的长整数将是“ echo -n> 1”或“ true> 1”。它并没有真正删除FD,而是仅指向一个空文件。

–eckes
17年5月8日在10:52

#3 楼

一种可能性是您删除的文件在文件系统中具有更多引用。如果创建了硬链接,则多个文件名将指向同一数据,并且在删除所有对数据的引用之前,这些数据(实际内容)将不会被标记为空闲/可用。删除文件之前,请先对其进行统计(名为“链接”的条目)或对它们进行ls -l(应为第二栏)。

如果确实在其他地方引用了文件,我猜您必须使用ls -i这个文件来找到inode编号,然后使用-inum 进行查找以找到对该文件的其他引用(您可能还想使用-mount也可以保留在同一文件系统中)。

#4 楼

如果已将分区配置为仅保留磁盘空间的一部分以供root用户使用,则df将不包括该可用空间。删除文件/目录,非root用户将无法写入特定分区。

通过尝试在设备上以root用户和非root用户身份创建文件,您可以轻松检查情况是否如此root用户。

另外,您可以通过运行

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...


并自行计算实际百分比来检查文件系统配置。 />要更改为仅用于root用户用途而保留的磁盘%,请执行

tune2fs -l <device> | egrep "Block count|Reserved block count


评论


一个人不应该在评论中说“谢谢”。尽管如此,我还是在这里做。

–dr0i
19年11月3日在15:18

#5 楼

通过打开文件的过程,文件仍然被锁定。要释放空间,请执行以下步骤:



运行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来检查是否已释放空间。如果仍然满了,也许您需要等待几秒钟,然后再次检查。


#6 楼

其他答案是正确的:如果删除文件,但空间没有释放,则通常是因为文件仍保持打开状态,或者还有其他硬链接。

帮助进行故障排除,请使用一个告诉您驱动器空间正在使用的工具:您可以使用du来了解空间的使用情况。更好的是,使用诸如xdiskusage之类的图形工具(有很多这样的工具)来追查罪魁祸首。 xdiskusage和朋友可以让您深入研究最大的太空猪,以查找空间的去向。

这样,您将迅速找到由于第二个硬链接而仍然占用空间的文件。它还会显示已删除但打开的文件所占用的空间(我相信,(因为权限未被允许)因为它无法读取文件名)。

#7 楼

另一个选择:由于不断创建数据的过程(例如日志,核心等),磁盘可能已满。实际上有可能释放了空间但立即将其填满。我实际上已经看到过这种情况。在这种情况下,df根本不会给出孔图片。使用du了解更多信息。

#8 楼

既然我知道您在/var中为redhat和gzipping文件期望FS缩小而又大量增长,但是却不断增长,请确保您为syslog重新启动服务。和

lsof -v file


无论如何都会向您展示。

评论


这实际上并没有增加多少。可接受的答案涵盖了2001年的逻辑。当您有50个代表时,如果要在现有答案中添加限定词,请使用注释。

–安德鲁(Andrew B)
13年3月23日在17:34

#9 楼

我正在使用EXT2,在这种情况下FSCK帮助了我。立即尝试关闭-F,在重新启动和fsck之后,我看到一半的已用空间。

评论


亲爱的马塞勒斯,您的解决方案已包含在已接受的答案中;有时如果您不被迫执行以下操作,则不想重新启动...

–鹿猎人
13年1月16日在9:31

#10 楼

要检查哪些已删除文件已占用内存,请输入命令

 $ sudo lsof | grep deleted


,它将显示已删除的文件以保存内存。

然后终止进程使用pid或name

$ sudo kill <pid>
$ df -h


现在检查您将拥有相同的内存

如果不输入以下命令,则查看哪个文件正在占用内存

# cd /
# du --threshold=(SIZE)

提及任何大小,它将显示哪些文件正在占用阈值大小以上,并删除该文件,您会发现保留的内存

#11 楼

如果您使用Windows 10作为双启动,则可以尝试启动到Windows 10,然后转到“磁盘清理”,选择合适的驱动器,然后单击“清理系统文件”。这对我有用。祝你好运。

#12 楼

一行:
kill -9 $(lsof | grep deleted | cut -d " " -f4)


评论


这只会杀死一堆程序。您将无法提前知道哪个。还不清楚为什么要这样做。

–迈克尔·汉普顿
20/11/23在19:30

我认为脚本复制粘贴并不是一件很顺利的事情。我建议解释一下,您的命令在做什么以及如何做。

–peterh-恢复莫妮卡
20 Nov 26 '13:10

#13 楼

打开终端尝试使用此命令df -Th
下一步使用此命令sudo du -h --max-depth = 1 /
在此命令中,您将找到磁盘使用情况详细信息
,然后以root用户身份打开删除文件
(root-local-share-trash)并删除文件