这个典型的羊群例子是如何工作的?

当必须通过文件系统同步程序(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/mylockfileflock -s 200200>/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(标准输入,输出,错误)。 文件名称很重要; 不同的进程可以使用不同的文件描述符; 只要名字一致,应该没问题。