5

当必须通过文件系统同步程序(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/mylockfilebash

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

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

4

1 回答 1

6

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

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

于 2013-08-01T14:21:16.690 回答