当必须通过文件系统同步程序(shell 脚本)时,我发现推荐flock
使用基于 - 的解决方案(也应该在 NFS 上工作)。在脚本中使用的典型示例(来自http://linux.die.net/man/1/flock)是:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
我不太明白为什么整个结构可以确保原子性。特别是,我想知道在执行这些代码行时按什么顺序执行flock -s 200
和执行。此订单是否有保证/确定性?我理解它的方式,如果这个习语应该起作用,它必须是确定性的。但是由于子shell是在子进程中产生的,我不明白这两个进程是如何同步自己的。我只看到这两个命令之间的竞争条件。200>/var/lock/mylockfile
bash
如果有人能让我对此的困惑消失并解释为什么这个结构可以用来安全地同步进程,我将不胜感激。
同时,如果有人知道,我会对选择任意文件描述符(例如200
在示例中)的安全性感兴趣,尤其是在具有许多客户端的大型 NFS 文件系统的上下文中。