/tmp 目录:0 个文件但显示已满?

/tmp 目录:0 个文件但显示已满?

与另一篇文章相关,在该篇文章中,感谢另一位发帖人,我终于能够删除 /tmp 内的文件。

然而,最后系统管理员不得不恢复几天前的快照才能恢复 mysql 服务。

我推断 mysql 服务器没有运行,事实也确实如此。一个错误是它无法写入 tmp 目录来创建 mysqld.sock/.pid 文件,因此它们不存在。

因此,服务器重新启动/重启并最终从以前的快照恢复,所以现在一切都正常,但该快照是几天前的,所以迹象如下输出所示:

drwxrwxrwt  2 root  root  34471936 Oct  8 20:47 tmp

那个大数字不知怎么的仍然被“记住”,我试图找出是什么写入了那个文件夹?在 Drupal 中,预览文件的路径设置为该目录,但我刚刚进行了一系列测试(该站点没有登录帐户/仅用于数据)下载、预览等,而 /tmp 文件夹中的文件编号从未改变,那么是什么写入了该文件夹?

这是一个除非出现问题否则不会关闭/重启的 Web 服务器。即便如此,重启后 /tmp 目录也不会清空。此外,在 rsC 文件中,TMPTIME=0仍为默认设置。

因此,我不确定3441936在实际目录为空时,还能查看哪里或如何调查是什么在保持该大小?或者,如何搜索正在使用该目录的进程。

这仅适用于 Drupal 安装。Ubuntu 12。

答案1

尝试这个。

$ sudo lsof | egrep '^COMMAND|deleted'

我在系统上看到的示例输出...

COMMAND     PID        USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
mysqld     2842      mysql    5u      REG                9,1        4633    6209543 /tmp/ibLRNV1i (deleted)
mysqld     2842      mysql    6u      REG                9,1         424    6209545 /tmp/ibnnYl1y (deleted)
mysqld     2842      mysql    7u      REG                9,1           0    6209546 /tmp/ib5ViM0O (deleted)
mysqld     2842      mysql    8u      REG                9,1           0    6209547 /tmp/ibh9U55F (deleted)
mysqld     2842      mysql   13u      REG                9,1           0    6209548 /tmp/ibRzqtwm (deleted)
mysqld     2842      mysql  319u      REG                9,1    25894907    6209553 /tmp/MLFxqPDX (deleted)
mysqld     2842      mysql  350u      REG                9,1   267677827    6209550 /tmp/MLFBkHbP (deleted)

许多 *nix 文件系统的共同特征是,没有什么可以阻止进程继续读取/写入已删除的文件,也没有任何东西可以阻止删除进程仍打开的文件。

某些程序确保临时文件不会残留的一种方法是(也可能是一种安全措施,尽管我不确定这有多“安全”)打开它们,然后立即“取消链接”(删除)它们。如果进程意外终止,磁盘空间将被释放。MySQL 会这样做:

如果 mysqld 终止,MySQL 会安排删除临时文件。在支持它的平台(如 Unix)上,这是通过在打开文件后取消链接来实现的。这样做的缺点是名称不会出现在目录列表中,并且您看不到填满临时文件目录所在文件系统的大型临时文件。(在这种情况下,lsof +L1 可能有助于识别与 mysqld 关联的大型文件。)

http://dev.mysql.com/doc/refman/5.6/en/temporary-files.html

很重要的一点:当删除仍处于打开状态的文件时,磁盘上的空间实际上并未释放,直到最后一个持有文件句柄的进程关闭该文件。在文件关闭之前,除了终止进程外,任何人(包括 root)都无法释放该空间。相反,终止(或尽可能正常停止)进程应该始终释放空间。

因此,我建议您查看一下您的系统可能存在哪些打开和删除的文件,这可能会给您提供一些线索。

就我的系统而言,MySQL 确实打开了许多临时文件,其中一些相当大。

如果您想窥视这些文件,这很容易做到,尽管您能够辨别的内容的性质差异很大。以 PID 和 FD 下的数字为例……例如,PID 2842 FD 350:

$ sudo strings /proc/2842/fd/350 | less

如果 MySQL 确实打开了已删除的临时文件,则停止并重新启动 MySQL 将释放该空间,然后您需要调查是什么原因导致这些文件保持打开状态,或者它们停留的时间超过适当时间,以及您是否有查询生成了过大的临时表并耗尽了您的 /tmp 空间。如果您的 /tmp 目录是其自己的分区/文件系统,那么df -h将为您提供有关可用空间和已用空间的更好答案。您可能不需要太担心目录条目本身的实际大小。

当然也可能不是 MySQL。:)

答案2

当您删除文件时,ext[234] 不会缩小目录的大小;它只是将条目标记为已删除,以便以后可以重新使用。如果您确实想收回这 34 MB,则需要删除并重新创建目录,或者启动到救援模式并e2fsck -D在卷上运行。

相关内容