我有一组shell脚本,使用truecrypt和rsync在我的系统上执行备份。我想避免这些各种脚本同时运行的可能性。
他们在子shell中使用flock
,如联机帮助页中所述:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile
但是,对于后续运行(退出状态为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
然后脚本工作。
我正确使用flock
吗?在块内调用flock -u
是否安全?
FYI麻烦的脚本是在命令块中调用truecrypt的脚本。
答案 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。