将多个标准输出重定向到单个文件

Posted

技术标签:

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

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

【问题讨论】:

从多个 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

【讨论】:

以上是关于将多个标准输出重定向到单个文件的主要内容,如果未能解决你的问题,请参考以下文章

将进程的标准输出重定向到多个管道

LINUX 标准错误输出重定向

重定向标准错误到标准输出 是啥意思

将标准输出重定向到文件[重复]

怎样去掉提示:nohup:重定向标准错误到标准输出

输出重定向