我有一套shell脚本,使用truecrypt和rsync在我的系统上执行备份。 我想避免这些不同脚本同时运行的可能性。
他们在一个子shell中使用flock
,如手册页所述:
( flock -n 9 || exit 1 # ... commands executed under lock ... ) 9>/var/lock/mylockfile
但是,locking总是无法获取后续运行(退出状态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
是否安全?
仅供参考麻烦的脚本是在命令块内调用truecrypt的脚本。
问题是你在后台运行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
锁定文件是持久的,处理所有可能的竞争条件将在复杂的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.