2014-05-14 52 views
5

我有一组shell脚本,它们使用truecrypt和rsync在我的系统上执行备份。我想避免这些不同脚本同时运行的可能性。flock(1)未能释放锁

它们在一个子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的脚本。

回答

4

问题是你在后台运行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点开门,导致保持锁。让backgrounding进程时的关闭FD 9:

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

# Output: 
# ok 
# ok 
+0

太棒了,谢谢!你确实是对的。我在调用truecrypt时关闭了文件描述符(并删除了'flock -u'调用),现在它工作得很好。 – QuasarDonkey