我正在运行一项计算量很大的科学工作,不时地吐出结果.这项工作基本上只是为了模拟相同的事情,所以它分为几台使用不同操作系统的计算机.我想将所有这些实例的输出定向到同一个文件,因为所有计算机都可以通过NFS/Samba看到相同的文件系统.以下是约束:
必须允许安全的并发附加.如果另一台计算机上的某个其他实例当前正在附加到该文件,则必须阻止.
性能并没有指望.每个实例的I/O只有每分钟几个字节.
简单就算了.这一点的全部意义(除了纯粹的好奇心)是这样我可以停止让每个实例写入不同的文件并手动将这些文件合并在一起.
不能依赖于文件系统的细节.必须在NFS或Samba装载上使用未知文件系统.
我正在使用的语言是D,如果重要的话.我看,标准库中似乎没有任何东西可以做到这一点.D语言和一般语言无关的答案都是完全可以接受和赞赏的.
在NFS上,您遇到了客户端缓存和陈旧数据的一些问题.我之前已经编写了一个独立于操作系统的锁模块来处理NFS.创建[datafile] .lock文件的简单想法在NFS上不起作用.解决它的基本思想是创建一个锁文件[datafile] .lock,如果存在意味着文件未被锁定,并且想要获取锁的进程将文件重命名为不同的名称,如[datafile] .lock.[主机名].[PID].重命名是一个足够原子的操作,在NFS上运行良好,可以保证锁的独占性.其余的基本上是一堆故障安全,循环,错误检查和锁定检索,以防过程在释放锁定并将锁定文件重命名回[datafile] .lock之前死亡.