ubuntu 服务器慢慢填满

Cra*_*893 5 ubuntu disk-space-utilization

前几天我们的 samba 服务器(ubuntu 8.04 ltr)共享已满,但当我去看它时,我看不到任何共享对它们有太多影响

我们有 5 个组共享,然后每个用户都有一个单独的共享

一个用户有 22gigs 的东西,其他一些用户有 10-20mb 的东西,其他人都是空的

所以可能总共有 26 个演出

我昨天删除了一些文件,今天释放了大约 250 mb 的空间,当我再次检查它是否完全满时,我删除了一些旧文件并释放了大约 170 mb 的东西,但我可以看到它在可用空间中慢慢减少。

我一直在运行 df -h

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1            241690180 229340500    169200 100% /
varrun                  257632       260    257372   1% /var/run
varlock                 257632         0    257632   0% /var/lock
udev                    257632        72    257560   1% /dev
devshm                  257632        52    257580   1% /dev/shm
lrm                     257632     40000    217632  16% /lib/modules/2.6.24-28-generic
Run Code Online (Sandbox Code Playgroud)

/易挥发的

我该怎么做才能找到占用了我这么多硬盘的东西?(总的来说,我对 unix 还很陌生,所以如果没有很好地解释,我深表歉意)

use*_*517 5

使用du追查包含被填充磁盘上的文件(S)的目录。

cd /
du -h --max-depth 1
Run Code Online (Sandbox Code Playgroud)

将显示 / 中的哪个目录使用最多的空间。遍历运行 du 命令的文件系统以找到罪魁祸首。

例如

cd /
du -h --max-depth 1
Run Code Online (Sandbox Code Playgroud)

显示 /usr 是系统上使用的 3.5G 中的 2.3G。

cd /usr
du -h --max-depth 1
Run Code Online (Sandbox Code Playgroud)

显示 /usr/lib 使用了 /usr 中 2.3 中的 1.1G ...


这也可能是由已删除的打开文件引起的。

您可以使用lsof查找打开但未链接(已删除)的文件

lsof +L1
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。正如手册页所述:

表单规范+L1将选择已取消链接的打开文件。表单规范+L1 <file_system>将选择指定文件系统上未链接的打开文件。

  • `sudo du -xb / --max-depth 3 |sort -n`? (2认同)

小智 5

(这是一个专注于 Linux 的答案。其他 UNIX 变体可能会有所不同。)

有两条与您的问题相关的信息:(1) 哪些文件正在填满您的文件系统,以及 (2) 哪些进程正在写入这些文件。

笔记

下面,当我将$字符放入命令中时,这可能是您需要替换实际值的占位符。希望在哪里做,哪里不做是显而易见的。

哪些文件?

请注意,在大多数文件系统类型中,确实有两种资源可供单个文件使用:元数据(例如 inode)和真实数据。您可以使用以下命令查看 inode 的数量(在 Google 中搜索定义,但它们是指向构成文件的结构的“指针”):

df -i
Run Code Online (Sandbox Code Playgroud)

...正如您已经知道的那样,这样的事情将显示真实数据正在使用的空间:

df -h
Run Code Online (Sandbox Code Playgroud)

另外,请注意文件系统空间可能被磁盘上不存在的文件占用。这些文件在某些​​进程中仍处于打开状态,但已被删除(我们将在下面介绍)。

一旦确定了完整的文件系统,就需要开始寻找许多小文件、一些大文件或两者兼而有之。元数据资源耗尽通常是由于有很多小文件造成的,而实际数据资源耗尽通常是由几个大文件造成的。我喜欢用这个命令来帮助查找大文件:

sudo find $file_system -mount -ls | awk '{print $7, $11}' | sort -rn > $output
Run Code Online (Sandbox Code Playgroud)

...以及此命令可帮助查找包含大量小文件的目录(更新::添加空终止以改进文件名处理):

sudo find . -mount -print0 | xargs -0n 1 dirname | sort | uniq -c | sort -rn > $output
Run Code Online (Sandbox Code Playgroud)

... 请注意,这些命令可能需要一段时间才能运行,并且会执行大量 I/O,具体取决于。运行后,您可以通读$output以查找有问题的文件或目录。每个的名称和位置可能会给你一个关于数据来自哪里的提示,但需要一些 Linux 经验。

一旦你确定了罪犯,你就rm $file可以摆脱这个问题。

哪些流程?

查找可能填满文件系统的进程的最直接方法是运行如下命令:

fuser -c $file_system 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

...这将告诉您具有给定文件系统的打开文件描述符(文件和网络套接字)的进程的PID(该2>/dev/null部分删除了一些您不需要的信息)。您也许可以仅从这些 PID 中推断出哪个进程正在填满您的文件系统。使用以下命令搜索进程:

ps -ef | grep $pid
Run Code Online (Sandbox Code Playgroud)

您还可以尝试运行此命令,这将为您提供更多详细信息(并帮助识别磁盘上没有相应文件名的打开文件——我在上面提到过):

sudo lsof $file_system | grep $directory_filling_up
Run Code Online (Sandbox Code Playgroud)

...如果您从fuser命令中识别出可疑的 PID,则可以执行以下操作:

sudo lsof -p $pid
Run Code Online (Sandbox Code Playgroud)

这个问题fuserlsof是他们只给你系统的快照在你运行命令的时间。如果运行它们时,有问题的进程没有写入,那么你就不走运了。您可以通过随着时间的推移重复运行它们并保存输出来解决这个问题。这将需要通读输出以查找模式,或编写程序来为您执行此操作。另一种方法是使用SystemTap 之类的工具。SystemTap 允许您捕获各种有用的信息,并且是“可编程的”。它甚至带有一些示例源文件,可以让您查看在一段时间内哪些进程正在写入哪些文件。这将是完美的,但它是一个高级工具,需要大量的 Linux 知识。

一旦您确定了违规进程,您就可以终止(并可能重新启动它们)。如果该进程与操作系统或一些很好的包装软件相关,很可能会重启他们的机制,但它取决于你的Linux发行版(我认为Ubuntu将允许您运行类似/etc/init.d/$init_script restart,但你必须检查您的发行版的文档)。否则,你可以杀死它,kill $pid或者kill -9 $pid如果它不表现。请注意该进程是如何运行的(例如 中显示的参数是什么ps -ef),以防您需要重新启动它(您可能需要参考该软件的文档)。