我在连续两次面试中都被问到这个问题,但经过一番研究并与各个系统管理员核实后,我还没有得到一个好的答案。我想知道是否有人可以帮我。
服务器磁盘空间不足。您注意到一个非常大的日志文件,并确定可以安全删除它。您删除了该文件,但磁盘仍然显示已满。是什么原因导致的?您将如何补救?您如何找到哪个进程正在写入这个巨大的日志文件?
答案1
这是一个常见的面试问题,也是各种生产环境中出现的情况。
该文件的目录条目已被删除,但日志记录进程仍在运行。操作系统不会回收空间,直到所有文件句柄都已关闭(例如,进程已被终止)并且所有目录条目都已删除。要查找写入该文件的进程,您需要使用命令lsof
。
问题的另一部分有时可能是“如何在不终止进程的情况下清除正在写入的文件?”理想情况下,你会将日志文件清零或截断用类似的方法: > /var/log/logfile
代替删除文件。
答案2
该文件还有另一个链接(硬链接或打开文件句柄)。删除文件只会删除目录条目;文件数据和 inode 会一直保留,直到删除对它的最后一个引用。
服务创建临时文件并立即删除它,同时保持文件打开,这是一种常见的做法。这会在磁盘上创建一个文件,但保证如果进程异常终止,该文件将被删除,同时还可以防止其他进程意外破坏该文件。例如,MySQL 对其所有磁盘临时表都执行此操作。恶意软件经常使用类似的策略来隐藏其文件。
在Linux下,您可以方便地以 的形式访问这些已删除的文件/proc/<pid>/fd/<filenumber>
。
答案3
我不是系统管理员,但从我在 Unix.SE 上收集到的信息来看,在文件取消链接后,Linux 系统不会真正删除文件(将空间标记为空闲/可重用),直到指向它们的所有文件描述符都已关闭。因此,要回答第一部分,空间尚未空闲,因为进程仍在读取它。要回答第二部分,您可以使用 查看哪个进程正在使用该文件lsof
。
答案4
如果写入文件的进程是 root,它将写入超级用户保留的文件空间。文件系统有此空间,以便在用户任务填满磁盘时保持系统正常运行。这个空间(我认为默认为 5%)对于许多工具来说是不可见的。
lsof 可以向您显示哪个进程已锁定该文件以及正在对其进行写入。