为什么`tail -f data_log | tmux 会话中的 grep 关键字可能会导致硬盘耗尽?

为什么`tail -f data_log | tmux 会话中的 grep 关键字可能会导致硬盘耗尽?

场景就像是,昨天我需要检查一些 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

有可能:

  1. data_log每天都有大量数据写入其中。
  2. 它是旋转的,可能使用logrotate.通常的轮换步骤至少涉及文件重命名,然后是压缩和删除未压缩的日志。
  3. tail -f(至少 GNU,也可能是其他),默认情况下继续读取旧文件,即使它被移动或删除。如果一个文件被删除,但程序有一个打开的文件句柄,Linux 会将数据保留在磁盘上,并将该空间标记为不可用。
  4. 这意味着日志轮换不会像应有的那样导致磁盘空间增加,而是会导致压缩日志和未压缩但已删除的日志两个都占用空间。

这样做的时间足够长,尽管采取了日志轮换等措施,或者其他人尝试手动删除日志,但您的服务器可能会耗尽空间。

相关内容