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

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

1
从多个NFS客户端写入单个文件最终保证会导致文件损坏,而不仅仅是交错的数据。 - Dale Hagglund
2个回答

3

这个方案可以行得通,但是它会带来并发问题,并且日志文件会变得难以理解。

我建议为每台机器设置一个日志文件,然后定期(比如每天晚上)将这些文件按照机器名称合并在一起,以机器名称作为文件名:

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

那应该能给你一些想法,我想。

2

NFS协议不支持原子追加写操作,因此在任何平台上使用NFS进行追加写操作时都不会是原子的。如果尝试这样做,文件将最终损坏。

当从多个线程或进程向文件追加内容时,只有在以追加模式打开文件、写入的字符串不超过文件系统块大小并且文件系统为本地时,对该文件的写操作才是原子的。但在NFS中,情况并非如此。

有一个解决方法,但我不知道如何从shell脚本中执行它。这个技术叫做“close-to-open缓存一致性”(查看说明)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接