Jan*_*cke 5 linux bash synchronization nfs locking
当必须通过文件系统同步程序(shell脚本)时,我发现了一个flock基于建议的解决方案(也应该在NFS上工作).从脚本(来自http://linux.die.net/man/1/flock)中使用的规范示例是:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么整个构造确保原子性.具体地讲,我想知道以何种顺序flock -s 200和200>/var/lock/mylockfile例如,当被执行bash执行这些代码行.这个订单是保证/确定性的吗?我理解它的方式,如果这个成语应该起作用,那一定是确定性的.但是由于子进程是在子进程中生成的,所以我不明白这两个进程是如何同步的.我只看到这两个命令之间的竞争条件.
如果有人能让我对此消失感到困惑并解释为什么这个结构可以用来安全地同步进程,我将不胜感激.
同时,如果有人知道,我会感兴趣的是选择一些任意文件描述符(例如200在示例中)是多么安全,特别是在具有许多客户端的大型NFS文件系统的上下文中.
在子shell (...) 200>/var/lock/mylockfile中执行任何命令之前,必须评估子shell的整个I/O上下文- 并完成I/O重定向,因此重定向总是先于flock -s 200.想想子shell是否将其标准输出传送到另一个命令; 必须在创建子shell之前创建该管道.这同样适用于文件描述符200重定向.
文件描述符号的选择确实无关紧要 - 除了建议不要使用文件描述符0-2(标准输入,输出,错误).文件名很重要; 不同的进程可以使用不同的文件描述符; 只要名字达成一致,就应该没问题.
| 归档时间: |
|
| 查看次数: |
3508 次 |
| 最近记录: |