场景就像是,昨天我需要检查一些 api bug。于是我就登录到了日志服务器。我打开了一个 tmux 会话,以便稍后可以重新连接到我的工作。
我输入tail -f data_log | grep keyword
调试。但当时并没有解决。因此,我决定保留此 tmux 会话以供稍后使用,并关闭了终端窗格。
今天,我的同事告诉我,我的 tmux 会话正在tail -f data_log | grep keyword
运行,导致该日志服务器上的硬盘耗尽。这让我感到羞愧、自责和困惑。
astail -f
打开自己的 stdout 文件描述符,并将 data_log 新添加的内容重定向到终端屏幕。
这个标准输出文件描述符可以接收无限量的数据吗?
这个文件描述符在哪里存储如此大量的数据?是否有真实的文件来存储它们?
tmux 与这个问题有什么关系吗?
如果 tmux 与这个问题无关,如果我打开一个正在运行的终端tail -f my_log
,并使用 crontab 每秒向 my_log 添加 1 个字节,这是否意味着每秒 2 个字节将存储在我的磁盘上?(1 表示 tail,1 表示 1)对于 crontab 任务)?
答案1
有可能:
data_log
每天都有大量数据写入其中。- 它是旋转的,可能使用
logrotate
.通常的轮换步骤至少涉及文件重命名,然后是压缩和删除未压缩的日志。 tail -f
(至少 GNU,也可能是其他),默认情况下继续读取旧文件,即使它被移动或删除。如果一个文件被删除,但程序有一个打开的文件句柄,Linux 会将数据保留在磁盘上,并将该空间标记为不可用。- 这意味着日志轮换不会像应有的那样导致磁盘空间增加,而是会导致压缩日志和未压缩但已删除的日志两个都占用空间。
这样做的时间足够长,尽管采取了日志轮换等措施,或者其他人尝试手动删除日志,但您的服务器可能会耗尽空间。