我有一组shell脚本,它们使用truecrypt和rsync在我的系统上执行备份。我希望避免这些不同的脚本同时运行的任何可能性。
它们在子subshell中使用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安全吗?
这些麻烦的脚本是那些在命令块中调用truecrypt的脚本。
发布于 2014-05-14 22:23:05
问题是在后台运行TrueCrypt,保持fd打开。您应该关闭fd,以防止后台进程挂锁。
下面是一个测试用例,以代替实际代码:
foo() {
(
flock -n 9 && echo "ok" || { echo failed; exit 1; }
sleep 10 &
) 9> lock
}
foo; foo
# Output:
# ok
# failedsleep是分叉的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发布于 2014-07-25 21:19:52
锁文件是持久的,处理所有可能的争用条件将在复杂的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.
https://stackoverflow.com/questions/23665780
复制相似问题