我有一个在多台机器上运行的程序,使用NFS,并且我想将它们所有的输出记录到一个文件中。我是否可以在每台机器上运行
./my_program >> filename
,或者我需要注意并发问题?因为我只是在追加,所以我认为不会有问题,但我只是想确保一下。./my_program >> filename
,或者我需要注意并发问题?因为我只是在追加,所以我认为不会有问题,但我只是想确保一下。这个方案可以行得通,但是它会带来并发问题,并且日志文件会变得难以理解。
我建议为每台机器设置一个日志文件,然后定期(比如每天晚上)将这些文件按照机器名称合并在一起,以机器名称作为文件名:
for i in "/path/to/logfiles/*"; do
echo "Machine: $i";
cat $i;
done > filename.log
NFS协议不支持原子追加写操作,因此在任何平台上使用NFS进行追加写操作时都不会是原子的。如果尝试这样做,文件将最终损坏。
当从多个线程或进程向文件追加内容时,只有在以追加模式打开文件、写入的字符串不超过文件系统块大小并且文件系统为本地时,对该文件的写操作才是原子的。但在NFS中,情况并非如此。
有一个解决方法,但我不知道如何从shell脚本中执行它。这个技术叫做“close-to-open缓存一致性”(查看说明)。