flock(1)未能解除锁定

时间:2014-05-14 21:51:05

标签: linux shell locking

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

他们在子shell中使用flock,如联机帮助页中所述:

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

但是,对于后续运行(退出状态为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是否安全?

FYI麻烦的脚本是在命令块中调用truecrypt的脚本。

2 个答案:

答案 0 :(得分:5)

问题是你在后台运行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

答案 1 :(得分:0)

锁定文件是持久的,处理所有可能的竞争条件将在复杂的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。