将多个标准输出重定向到单个文件
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
【讨论】:
以上是关于将多个标准输出重定向到单个文件的主要内容,如果未能解决你的问题,请参考以下文章