flock(1)未能解除锁定

Qua*_*key 7 linux shell locking

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

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

(
    flock -n 9 || exit 1
    # ... commands executed under lock ...
) 9>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)

但是,锁定总是无法获取后续运行(退出状态为1).

然而fuser /var/lock/mylockfile,lsof /var/lock/mylockfile什么都不显示.

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

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

然后脚本工作.

我使用flock得当吗?flock -u在街区内打电话是否安全?

仅供参考这些麻烦的脚本是在命令块中调用truecrypt的脚本.

tha*_*guy 5

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

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

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

# Output:
# ok
# failed
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)