【问题标题】:Redirecting multiple stdouts to single file将多个标准输出重定向到单个文件
【发布时间】:2010-04-26 00:23:52
【问题描述】:

我有一个使用 NFS 在多台机器上运行的程序,我想将它们的所有输出记录到一个文件中。我可以在每台机器上运行./my_program >> filename,还是我应该注意并发问题?由于我只是追加,我认为不会有问题,但我只是想确保。

【问题讨论】:

  • 从多个 nfs 客户端写入单个文件最终会导致文件损坏,而不仅仅是交错数据。

标签: linux command-line stdout nfs


【解决方案1】:

这可能行得通,但是是的,您会遇到并发问题,并且日志文件基本上无法辨认。

我建议每台机器都有一个日志文件,然后定期(比如每晚)将文件与机器名连接起来作为文件名:

for i in "/path/to/logfiles/*"; do
    echo "Machine: $i";
    cat $i;
done > filename.log

我想这应该会给你一些想法。

【讨论】:

    【解决方案2】:

    NFS 协议不支持原子追加写入,因此对于任何平台,追加写入在 NFS 上绝不是原子的。如果您尝试,文件最终会损坏。

    当从多个线程或进程附加到文件时,对该文件的 fwrite 是原子的,条件是文件以附加模式打开,写入的字符串不超过文件系统块大小并且文件系统是本地的。在 NFS 中不是这样。

    有一个解决方法,虽然我不知道如何从 shellscript 中做到这一点。该技术称为close-to-open cache consistency

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多