【问题标题】:How does this canonical flock example work?这个典型的羊群示例是如何工作的?
【发布时间】:2013-08-02 12:35:51
【问题描述】:

当必须通过文件系统同步程序(shell 脚本)时,我发现基于flock 的解决方案是recommended(也应该可以工作on NFS)。在脚本中使用的规范示例(来自 http://linux.die.net/man/1/flock)是:

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile 

我不太明白为什么整个结构可以确保原子性。特别是,我想知道flock -s 200200>/var/lock/mylockfile 的执行顺序是什么时候,例如bash 执行这些代码行。此订单是否有保证/确定性?按照我的理解,如果这个习语应该起作用,它必须是确定性的。但是由于子shell是在子进程中产生的,所以我不明白这两个进程是如何同步自己的。我只看到了这两个命令之间的竞争条件。

如果有人能消除我对此的困惑并解释为什么可以使用此构造来安全地同步进程,我将不胜感激。

同时,如果有人知道,我会对选择任意文件描述符(例如示例中的 200)的安全性感兴趣,尤其是在具有大型 NFS 文件系统的上下文中很多客户。

【问题讨论】:

    标签: linux bash synchronization locking nfs


    【解决方案1】:

    必须评估子 shell (...) 200>/var/lock/mylockfile 的整个 I/O 上下文 - 并完成 I/O 重定向 - 才能在子 shell 中执行任何命令,因此重定向始终在 @987654324 之前@。考虑一下子shell是否将其标准输出通过管道传输到另一个命令;必须在创建子外壳之前创建该管道。这同样适用于文件描述符 200 重定向。

    文件描述符编号的选择实际上并不重要——除此之外,建议不要使用文件描述符 0-2(标准输入、输出、错误)。文件名很重要;不同的进程可以使用不同的文件描述符;只要名称一致,应该没问题。

    【讨论】:

    • 好的,非常感谢,这在应用command -> pipe -> output_device 透视图时很有意义。并且澄清一下:如果多个实例同时尝试创建/var/lock/mylockfile 也没关系,只有一个调用flock -s 200 的实例可以获胜,对吧?
    • 好吧,flock -s 请求共享锁;这可以防止任何人修改文件,但也允许多个进程将其锁定在共享模式下。您希望flock -x(或没有标志)获得排他锁。
    • 对,现在我明白了stackoverflow.com/a/169969/145400。再次感谢!
    • 在那个答案中使用-w 10,代码应该是if flock -x -w 10 200; then ...use the file...; fi,而代码当前假设没有超过超时并且锁定成功。评论也添加到其他帖子。
    • 当然。我不会在超时时使用它。还有一件事(可能很明显,但值得一问):一旦 subshel​​l 完成,锁就会自动释放,是吗?整个代码块之后的rm /var/lock/mylockfile 会进行清理,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2015-04-12
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2019-12-12
    相关资源
    最近更新 更多