【问题标题】:in shell scripting (bash), how does tail work for continuously updated file?在 shell 脚本(bash)中,tail 如何为不断更新的文件工作?
【发布时间】:2021-11-26 07:54:19
【问题描述】:

我有一个正在不断更新的文件。 每次我拨打tail file.log 时都会显示不同的结果。

我的问题是,它是如何在幕后工作的? 我希望它从字节向后读取文件,但同时它正在不断更新。它如何在不损坏文件的情况下工作,但显示未损坏的结果?

每次我谷歌How does tail work for continuously updated file, 我得到了关于如何使用tail -f file.log 监控它的解决方案,我知道它有效。

但我想知道它是如何工作的。

【问题讨论】:

标签: bash tail


【解决方案1】:

每个搜索引擎中的man tail 都应将其链接到tail(1),并在您进一步阅读时解释这一点,因为-s 是选项。

【讨论】:

    【解决方案2】:

    我希望它从字节向后读取文件,但同时它正在不断更新。它如何在不损坏文件的情况下工作,但显示未损坏的结果?

    每个打开的文件都有一个关联的文件偏移量与打开的文件描述符相关联(参见man 2 lseekman 3 lseekman open以及维基百科上的文件描述符) .

    文件偏移量位于文件末尾(指向过去文件中的最后一个字符)系统调用从文件中读取更多数据将“阻塞”(参见man 3 read)(或者在O_NONBLOCK 的情况下将返回读取零字节,但假设我们忽略这种情况)。

    文件描述符将被阻止读取,直到新数据写入文件。进程被阻塞——所有逻辑都在内核中实现。假设内核有一个等待文件上新事件的“等待”进程列表。当其他进程将新数据写入文件末尾时,内核会在文件末尾等待进程,内核会唤醒这些进程。

    当进程被唤醒时,read()调用终于可以读取可用数据了。 read() 返回新数据,移动文件偏移量,进程继续工作。

    当从多个文件读取时,有一个特殊的系统调用,它允许在多个文件描述符上等待“新数据”。请参阅man -a selectman poll

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多