我有一组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安全吗?

仅供引用,麻烦的脚本是在命令块中调用truecrypt的脚本。

最佳答案

问题是您在后台运行TrueCrypt,同时保持fd处于打开状态。您应该关闭fd,以防止后台进程卡在锁上。

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

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

# Output:
# ok
# failed

在打开fd 9的情况下生成sleep,从而保留了该锁。在后台启动进程时,让我们关闭fd 9:
foo() {
  (
    flock -n 9 && echo "ok" || { echo failed; exit 1; }
    sleep 10 9>&- &
  #          ^-------- Right here
  ) 9> lock
}
foo; foo

# Output:
# ok
# ok

关于linux - flock(1)无法释放锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23665780/

10-13 05:23