"tail -f"让磁盘满了?

use*_*872 4 logging disk tail sunos

我们的应用程序服务器(sunOS)总是让磁盘已满.我们的基础设施团队表示,这是由太多"tail -f"流程造成的.由于应用程序经常轮换日志文件,导致死链接而没有磁盘空间?我以前从未听说过这个.该命令真的导致磁盘已满吗?

小智 6

在对该文件的所有引用都消失之前,无法回收文件占用的空间.因此,打开文件的任何进程都将阻止从磁盘中删除该文件.

例如,活动tail -f跟随文件.

如果需要删除这些文件以释放磁盘空间(例如,因为它们非常大,或者它们中有很多),那么拥有处理它们的进程将阻止它们被删除,并最终导致磁盘填充起来.

编辑以回应对其他答案的评论:

您报告的诊断正是您在亚当和我描述的情况下所期望的.df报告56G磁盘正在使用,并du报告仅10G在文件夹中可见.这种差异是因为有一些46G文件已从文件夹中删除,但无法从磁盘中物理删除,因为某些进程持有对它们的引用.

很容易自己试验:找到一个可以安全使用的文件系统,并创建一个庞大的文件.编写一个打开文件并进入无限循环的C程序.现在,执行以下操作:

  • 启动该程序
  • 检查输出 df
  • rm 文件
  • df再次检查输出
  • 停止你的程序
  • df再次检查输出

您将看到输出文件dfrm文件没有变化,但一旦停止程序就会改变(因此删除了对文件的最后一次引用).

如果您需要更多证据证明这是正在发生的事情,您可以从/proc文件系统获取信息(如果有的话).具体来说,找到其中一个tail -f进程(或您认为可能是其他进程)的PID ,并查看该目录/proc/<pid>/fd以查看它已打开的所有文件.

(我家里没有*nix,所以我实际上无法检查看到你/proc/<pid>/fd在这种情况下会看到什么)