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