Logging &引用;尾部-f“;使磁盘满?

Logging &引用;尾部-f“;使磁盘满?,logging,disk,tail,sunos,Logging,Disk,Tail,Sunos,我们的应用服务器(sunOS)总是磁盘满。我们的基础设施团队说这是由太多的“尾部f”进程造成的。由于应用程序频繁地旋转日志文件,导致死链接和磁盘空间不足? 我以前从没听说过这个。该命令是否真的导致磁盘已满?tail是一个查看文件结尾的命令,-f实时执行该命令,每当修改文件本身时更新显示。它允许实时查看日志文件 tail会以两种方式导致问题: 如果tail-f被错误地用于写入文件而不是交互式控制台,那么这是一种复制文件的低效方法,并且会创建重复的日志 tail-f使日志文件保持活动状态,因此尝试自

我们的应用服务器(sunOS)总是磁盘满。我们的基础设施团队说这是由太多的“尾部f”进程造成的。由于应用程序频繁地旋转日志文件,导致死链接和磁盘空间不足?
我以前从没听说过这个。该命令是否真的导致磁盘已满?

tail
是一个查看文件结尾的命令,
-f
实时执行该命令,每当修改文件本身时更新显示。它允许实时查看日志文件

tail
会以两种方式导致问题:

  • 如果
    tail-f
    被错误地用于写入文件而不是交互式控制台,那么这是一种复制文件的低效方法,并且会创建重复的日志
  • tail-f
    使日志文件保持活动状态,因此尝试自动删除日志文件的维护任务将失败。这会因为不允许旧的日志文件老化而中断日志文件的循环
  • 如果您的基础架构团队抱怨访问不到一周的文件,您确实需要更多的驱动器空间和/或更少的详细日志记录策略,因为他们无法保持足够的日志,以防出现问题并需要跟踪。如果日志的时间早于此,那么它们可能有一个很好的理由,并且过度使用
    tail
    ——就像其他保持文件打开的方式一样——可能会阻止文件被及时删除


    命令本身不太可能填满磁盘,但它可能会阻止磁盘卫生操作。

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

    例如,文件后面的活动
    tail-f

    如果需要删除这些文件以释放磁盘空间(例如,因为它们非常大,或者它们的数量非常多),则保留对它们的引用的进程将阻止删除它们,并最终导致磁盘填满

    根据对另一个答案的评论进行编辑:

    您报告的诊断正是您希望在Adam和我描述的情况下看到的
    df
    报告磁盘的
    56G
    正在使用,而
    du
    报告只有
    10G
    在文件夹中可见。这种差异是因为有相当于46G的文件已从文件夹中删除,但无法从磁盘中物理删除,因为某些进程持有对这些文件的引用

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

    • 启动程序
    • 检查
      df的输出
    • rm
      文件
    • 再次检查
      df的输出
    • 停止你的程序
    • 再次检查
      df的输出
    您将看到
    df
    的输出在
    rm
    加载文件后不会更改,但在停止程序后会更改(从而删除对文件的最后引用)

    如果您需要更多的证据来证明这一点,您可以从
    /proc
    文件系统获取信息(如果您有)。具体地说,找到一个
    tail-f
    进程(或您认为可能是原因的其他进程)的PID,并查看目录
    /proc//fd
    ,查看它打开的所有文件


    (我家里没有*nix,所以我无法检查您在这种情况下会看到什么)

    这个问题可能更适合Stack Overflow的姐妹站点之一。谢谢您,Adam。让我把它发布到serverfault.com。顺便说一句,我看到在我们退出putty会话或按下“Ctrl+C”后,尾部进程将被终止,为什么有这么多尾部进程读取日志文件?这是一个很好的问题。不幸的是,我对Linux系统管理知之甚少,无法告诉您如何找到它。祝你在ServerFault版本的问题上好运。Adam,当我键入命令“df-h”时,会在/dev/md/dsk/d159g56g2.5g96%/log下面,但是,如果我转到日志目录,键入“du-sh”,看起来文件夹的大小没有上面显示的那么大:/log>du-sh10g。我们发现有很多“tail-f”进程,可能已经死了,正在读取该文件夹中的日志文件。因此,我们怀疑那些尾部过程是否会占用空间非常感谢,Hurkyl。是的,我终于找到了根本原因。我的应用程序在退出时没有杀死所有被调用的远程进程。