首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果无法获得锁,为什么bash的羊群不带超时出口呢?

如果无法获得锁,为什么bash的羊群不带超时出口呢?
EN

Stack Overflow用户
提问于 2010-05-24 11:34:13
回答 1查看 4.8K关注 0票数 3

我正在使用flock,这是一个用于文件锁的bash命令,以防止代码的两个不同实例不止一次运行。

我正在使用这个测试代码:

代码语言:javascript
复制
( ( flock -x 200 ;  sleep 10 ; echo "original finished" ; ) 200>./test.lock ) &
( sleep 2 ; ( flock -x -w 2 200 ; echo "a finished" ) 200>./test.lock ) &

我正在运行两个子外壳(背景接地)。(flock NUM; ...) NUM>FILE语法来自flock's man page

我希望第一个子subshell将在test.lock上获得一个独占锁,然后等待10秒,然后打印“原始完成”,一直保持锁。第二个子subshell将在大致相同的时间启动,等待2秒,然后尝试获得test.lock上的锁,但在2秒后超时。如果它有锁,它就会打印“完成”。如果它没有得到锁,子外壳应该停止,不应该打印任何东西。

因为第一个子should等待的时间更长,它将保持锁10秒,所以第二个子should不应该获得锁,也不应该完成锁。也就是说,一个人应该看到“原始成品”印刷,而不是两者兼而有之。

实际发生的情况是,“一个成品”被打印,然后“原始成品”被打印出来。

这意味着第二个子subshell要么是(a)不使用与第一个子subshell相同的锁,要么是(b)它无法获得锁,而是继续执行或(c)其他什么。

为什么那些锁不能像我预期的那样起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-24 11:43:44

问题是,如果flock进程无法在超时内获得锁,它就无法杀死父进程(即生成父进程的shell )--它所能做的就是返回一个失败的返回代码。在继续之前,您需要检查返回代码:

代码语言:javascript
复制
flock <params> && <do other stuff>

所以

代码语言:javascript
复制
( ( flock -x 200 ;  sleep 10 ; echo "original finished" ; ) 200>./test.lock ) & ( sleep 2 ; ( flock -x -w 2 200 && echo "a finished" ) 200>./test.lock ) &

做你想做的事。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2896633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档