当必须通过文件系统同步程序(shell脚本)时,我发现了一个基于flock
的解决scheme(也应该在NFS上工作)。 从脚本内使用的规范示例(来自http://linux.die.net/man/1/flock )是:
( flock -s 200 # ... commands executed under lock ... ) 200>/var/lock/mylockfile
我不明白为什么这个整个构造确保了primefaces性。 特别是,我想知道当例如bash
执行这些代码200>/var/lock/mylockfile
, flock -s 200
和200>/var/lock/mylockfile
被执行的200>/var/lock/mylockfile
。 这个顺序是保证/确定的吗? 我的理解是,这个习语应该是确定性的。 但是由于子shell是在subprocess中产生的,我不明白这两个进程是如何同步的。 我只看到这两个命令之间的竞争条件已经。
我会很感激,如果有人可以让我对这个消失的困惑,并解释为什么这个构造可以用来安全地同步进程。
同时,如果有人知道,我会感兴趣的是select一些任意的文件描述符(如本例中的200
)是多么的安全,特别是在有很多客户端的大型NFS文件系统的情况下。
子shell (...) 200>/var/lock/mylockfile
的整个I / O上下文必须在子shell中执行任何命令之前进行评估 – 并完成I / O重定向。重定向总是在flock -s 200
之前。 考虑一下子shell是否将其标准输出传送给另一个命令; 该管道必须在创建子shell之前创建。 这同样适用于文件描述符200重定向。
文件描述符编号的选择实际上丝毫不重要 – 超过建议不要使用文件描述符0-2(标准输入,输出,错误)。 文件名称很重要; 不同的进程可以使用不同的文件描述符; 只要名字一致,应该没问题。