我有一组shell脚本,使用truecrypt和rsync在我的系统上执行备份.我想避免这些各种脚本同时运行的任何可能性.
他们在子shell中使用flock,如联机帮助页中所述:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile
然而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
然后脚本工作.
我正确使用羊群吗?在块内调用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打开分叉,导致锁定被保留.让我们在后台进程时关闭fd 9:
foo() {
(
flock -n 9 && echo "ok" || { echo Failed; exit 1; }
sleep 10 9>&- &
# ^-------- Right here
) 9> lock
}
foo; foo
# Output:
# ok
# ok