将多个stdouts重定向到单个文件

时间:2010-04-26 00:23:53

标签: linux command-line stdout nfs

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

2 个答案:

答案 0 :(得分:3)

这可行,但是,你会遇到并发问题,日志文件基本上是无法解读的。

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

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

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

答案 1 :(得分:2)

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

当附加到多个线程或进程的文件时,在以附加模式打开文件的情况下,写入该文件的文件是原子的,写入它的字符串不超过文件系统blocksize,文件系统是本地的。在NFS中并非如此。

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