加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux – flock(1)无法释放锁定

发布时间:2021-01-14 02:08:07 所属栏目:Linux 来源:网络整理
导读:我有一组shell脚本,使用truecrypt和rsync在我的系统上执行备份.我想避免这些各种脚本同时运行的任何可能性. 他们在子shell中使用flock,如联机帮助页中所述: ( flock -n 9 || exit 1 # ... commands executed under lock ...) 9/var/lock/mylockfile 但是,

我有一组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 -u是否安全?

仅供参考这些麻烦的脚本是在命令块中调用truecrypt的脚本.

最佳答案 问题是你在后台运行TrueCrypt,保持fd打开.您应该关闭fd以防止后台进程挂在锁上.

代替您的实际代码,这是一个测试用例:

foo() {
  ( 
    flock -n 9 && echo "ok" || { echo failed; exit 1; }
    sleep 10 &
  ) 9> lock
}
foo; foo

# Output:
# ok
# failed

睡眠是用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

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读