当我运行时,df
它显示根设备已满。
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.9G 9.4G 0 100% /
我查看了inode
使用情况,发现根设备有足够的可用空间
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 640K 103K 538K 16% /
但是,当我运行du
命令时,它显示我只使用2G
了9.9G
。
ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0 ./sys
964K ./boot
4.0K ./srv
0 ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0 ./proc
2.0G .
这真是让我抓狂,也很有趣。这对我们来说是个大问题,因为根磁盘/
已满,我们网站的一些功能正在失败。
请帮我解决(也理解)这个问题。
谢谢。
答案1
在 *nix 中删除文件后,只要进程打开它们,它们就会继续存在于磁盘上(并占用磁盘空间)。利用这一点来“保护”临时文件是很常见的,方法是创建较小的临时文件,删除它们,然后使用已删除的文件来存储数据,而不必担心其他进程(轻易)访问它,因此,如果以这种方式处理临时数据库或多媒体编辑会话,则已删除文件的空间量可能会变得非常大。另一种可能导致如此多“丢失”空间的原因是,如果系统已升级(多次)而没有重新启动或重启程序,导致所有旧的 .so 库都被升级前启动且仍在运行的程序保持打开状态。
df
看到这些文件使用的空间,因为它只是查看设备上分配了多少空间,但却du
看不到它们,因为没有任何相应的目录条目。
此类“隐藏”使用空间只有在已删除文件的进程打开并关闭这些文件时才能释放。您可以使用该fuser
命令找到这些进程并终止它们(或者,对于许多守护进程,发送信号告诉它们关闭并重新打开任何打开的文件)。
答案2
有时候,如果磁盘已满,则直到重新启动/重新挂载时才会发现磁盘仍然已满,即使您删除了大量文件。
答案3
就我而言,我只是重新启动了 syslogd 来恢复磁盘空间。我丢失了 3GB!我的服务器已经运行了 250 天。
答案4
有一种方法可以在不重新启动应用程序的情况下清理空间。详情如下:
假设您正在
foo
运行一个进程并创建一个名为 abc.log 的 2 GB 文件。现在假设这个 abc.log 被其他人删除了。获取
foo
的 pid(假设为 123)。因此/proc/123/fd
将显示 所打开的文件描述符列表foo
。带有 abc.log 的文件描述符将显示为已删除。假设fd
abs.log 的 是 111。如果您运行less /proc/123/fd/111
,它仍将显示所有 2 GB 的数据。运行
echo " " > /proc/123/fd/111
。这将用空字符串覆盖内容。执行此命令后,如果您尝试,df
它将显示通过清理 abc.log 恢复的额外 2 GB。
就是这样。我在 CentOS 上试过了,成功了。