【问题标题】:will io direction operation lock the file?io方向操作会锁定文件吗?
【发布时间】:2019-01-04 06:21:20
【问题描述】:

我已经有一个不断增长的 nginx 日志文件,大约 20G,我希望轮换它。

1、imv旧的日志文件到新的日志文件

2,我用> old_log_file.log在大约2~3秒内截断旧的日志文件

当我进行截断(大约 2~3 秒)时,如果旧日志文件上有锁(写锁?)?

在那个 2~3s 的时间里,nginx 会返回 502 等待将日志追加到旧的日志文件,直到锁被释放?

谢谢你的解释。

【问题讨论】:

  • mv old_log_file.log new_log_file.log && touch old_log_file.log
  • 我认为您的命令不会起作用,因为mv 不会更改旧日志文件的inode。由于inodenginx 仍将登录到“new_log_file”。然后你创建了一个名为 olg 日志文件的新日志文件,但是 inode 改变了,nginx 直到 nginx -s reload 配置文件才会写入它。
  • 如果nginx 是这样关联日志的,那么您可能是正确的。那为什么不cp -a old_log_file.log new_log_file.log && :> old_log_file.log呢?
  • 我尝试了2种截断方法:>和'logrotate',它们都导致nginx输出502 - 很短的时间,然后是200。和logrotate的处理过程和你一样在cp 之后说截断。现在我不知道如何调试这个错误......
  • 这不是一个错误,它是一个特性。

标签: linux redirect io truncate


【解决方案1】:

在 Linux 上,(几乎)没有强制性的file locks(更准确地说,内核中曾经有一些mandatory locking feature,但它已被弃用,你真的应该避免使用它)。文件锁定发生在 flock(2)lockf(3) 并且是 advisory 并且应该是 explicit (例如使用 flock(1) 命令,或某些程序调用 flock 或 @987654339 @)。

因此,与文件相关的每个锁定实际上都是使用该文件的所有软件之间的约定mv(1) 或您的 shell 的重定向不使用文件锁定)。

请记住,Linux 上的文件大多是 i-node(参见 inode(7)),它可能有零个、一个或多个文件路径(参见 path_resolution(7) 并注意 link(2)rename(2)、@987654332 @) 并通过一些 file descriptor 使用。阅读ALP(或许还有Operating Systems: Three Easy Pieces)了解更多信息。

在您的问题的情况下不会发生文件锁定(并且涉及的 i 节点和文件描述符是独立的)。

考虑使用logrotate(8)

某些软件提供了重新加载配置和重新打开日志文件的方法。您应该阅读nginx 的文档。

【讨论】:

  • logrotate 的源代码显示它首先 cp 旧的然后截断旧的,inode 不会改变。实际上我在> 导致502 问题之后使用了logrotate,但问题仍然存在,然后我问了这个问题。对不起我的英语。
  • logrotatekill -USR1 nginx.pid 会重新加载配置文件,我尝试的所有方法都不能解决问题。
  • 很好。我了解到“>”不会锁定文件,即使至少截断了 2~3 秒。非常感谢,我会继续为我的 502 寻找答案。
  • i-nodes 和文件描述符方面的原因。您会更好地了解计算机中发生的情况
  • 也许,文件偏移量正在迅速减少,因为> 正在截断,同时 nginx 正在附加具有缩小偏移量的日志(我不知道如何描述不稳定的偏移量)跨度>
【解决方案2】:

它是否锁定文件取决于应用程序。生成此日志文件的应用程序必须具有清除日志文件的选项。一个例子是在编辑器中,比如 vim 文件可以在编辑器中打开时进行外部修改。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2022-07-05
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2021-05-07
    相关资源
    最近更新 更多