Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux flock(1)未能释放锁_Linux_Shell_Locking - Fatal编程技术网

Linux flock(1)未能释放锁

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/

我有一组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
安全吗


仅供参考,麻烦的脚本是在命令块内调用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
调用),现在它工作得很好。