Linux flock(1)未能释放锁
我有一组shell脚本,它们使用truecrypt和rsync在我的系统上执行备份。我想避免这些不同的脚本同时运行的任何可能性 他们在子shell中使用Linux flock(1)未能释放锁,linux,shell,locking,Linux,Shell,Locking,我有一组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/
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的脚本。问题是您在后台运行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工具: 比如:
flom -- my_first_command &
flom -- my_second_command &
您可以序列化它们,而不会产生基于文件的持久锁的所有负面影响。以下是一些相关的用例示例:
干杯
CHF.太棒了,谢谢!你确实是对的。我在调用truecrypt时关闭了文件描述符(并删除了
flock-u
调用),现在它工作得很好。