Linux 服务器空间不足

31 linux shell log-files disk-space-utilization

我在连续两次采访中被问到这个问题,但经过一些研究和与各种系统管理员的核实后,我没有得到好的答案。我想知道是否有人可以帮助我。

服务器磁盘空间不足。您注意到一个非常大的日志文件,并确定可以安全地删除它。您删除了文件,但磁盘仍然显示它已满。什么会导致这种情况,您将如何补救?您如何找到哪个进程正在写入这个巨大的日志文件?

eww*_*ite 56

这是一个常见的面试问题,也是各种生产环境中出现的情况。

该文件的目录条目已被删除,但日志记录过程仍在运行。在所有文件句柄都已关闭(例如,进程已被终止)并删除所有目录条目之前,操作系统不会回收该空间。要查找写入文件的进程,您需要使用该lsof命令。

问题的另一部分有时可能是“如何在不终止进程的情况下清除正在写入的文件?” 理想情况下,您应该使用类似的内容“归零”或“截断”日志文件: > /var/log/logfile而不是删除该文件。

  • 我在每次采访中都会问这个问题的一个变体:“你收到磁盘已满的消息。`df` 表示你的空间不足,`du` 表示你几乎没有使用任何空间。是什么导致了它,为什么不两个工具一致吗?” (2认同)

tyl*_*erl 14

还有另一个指向该文件的链接(硬链接或打开的文件句柄)。删除文件只会删除目录项;文件数据和 inode 一直存在,直到对它的最后一个引用被删除。

服务创建一个临时文件并在保持文件打开的同时立即删除它是一种常见的做法。这会在磁盘上创建一个文件,但保证如果进程异常终止该文件将被删除,并且还可以防止其他进程意外踩踏该文件。例如,MySQL 对其所有磁盘临时表执行此操作。恶意软件经常使用类似的策略来隐藏其文件。

在 Linux 下,您可以方便地访问这些已删除的文件/proc/<pid>/fd/<filenumber>


小智 8

我不是系统管理员,但从我在 Unix.SE 上收集到的信息来看,Linux 系统在取消链接后实际上不会删除文件(将空间标记为空闲/可重用),直到指向它们的所有文件描述符都有已关闭。所以要回答第一部分,空间还不是空闲的,因为一个进程仍在读取它。要回答第二个问题,您可以查看哪个进程正在使用带有lsof.


Man*_*iur 1

如果写入文件的进程是root,它将写入超级用户保留的文件空间。文件系统拥有此空间,可以在用户任务填满磁盘的情况下保持系统运行。这个空间(恕我直言,默认为 5%)对于许多工具来说是不可见的。

lsof 可以向您显示哪个进程已锁定该文件,因此正在写入该文件。