羊群(1)未能释放locking

我有一套shell脚本,使用truecrypt和rsync在我的系统上执行备份。 我想避免这些不同脚本同时运行的可能性。

他们在一个子shell中使用flock ,如手册页所述:

 ( flock -n 9 || exit 1 # ... commands executed under lock ... ) 9>/var/lock/mylockfile 

但是,locking总是无法获取后续运行(退出状态1)。

然而fuser /var/lock/mylockfilelsof /var/lock/mylockfile显示任何内容。

现在,如果我添加命令flock -u手动解锁,如下所示:

 ( flock -n 9 || exit 1 # ... commands executed under lock ... flock -u 9 ) 9>/var/lock/mylockfile 

然后脚本工作。

我是否正确使用flock ? 在块内调用flock -u是否安全?

仅供参考麻烦的脚本是在命令块内调用truecrypt的脚本。

问题是你在后台运行TrueCrypt,保持fd打开。 您应该关闭fd以防止后台进程挂在锁上。

代替你的实际代码,这里是一个测试用例:

 foo() { ( flock -n 9 && echo "ok" || { echo failed; exit 1; } sleep 10 & ) 9> lock } foo; foo # Output: # ok # failed 

sleep与fd 9分开,导致锁被保留。 在背景进程中关闭fd 9:

 foo() { ( flock -n 9 && echo "ok" || { echo failed; exit 1; } sleep 10 9>&- & # ^-------- Right here ) 9> lock } foo; foo # Output: # ok # ok 

锁定文件是持久的,处理所有可能的竞争条件将在复杂的shell程序中转换你的脚本。

看看FLoM工具: http : //sourceforge.net/projects/flom/

像这样的东西:

 flom -- my_first_command & flom -- my_second_command & 

你可以序列化它们,而没有持久化文件锁的黑暗副作用。 以下是一些相关的用例示例: http : //sourceforge.net/p/flom/wiki/FLoM%20by%20examples/

干杯

Ch.F.