为什么不bash的群如果没有获得锁,超时退出?

我在玩flock ,一个用于文件locking的bash命令,以防止两个不同的代码实例运行多次。

我正在使用这个testing代码:

 ( ( flock -x 200 ; sleep 10 ; echo "original finished" ; ) 200>./test.lock ) & ( sleep 2 ; ( flock -x -w 2 200 ; echo "a finished" ) 200>./test.lock ) & 

我正在运行2个subshel​​l(背景)。 (flock NUM; ...) NUM>FILE语法来自flock的手册页 。

我期望第一个子shell会在test.lock上获得排他锁,然后等待10秒钟,然后打印“原始完成”,一直持有锁。 第二个子shell将会或多或less地同时启动,等待2秒钟,然后尝试lockingtest.lock,但在2秒后超时。 如果它获得一个锁,那么它将打印“完成”。 如果没有获得locking,则应该停止该子shell,并且不应该打印任何内容。

由于第一个子shell等待的时间更长,所以它会将锁保持10秒,所以第二个子shell不应该获得锁,不应该完成。 即应该看到“原始完成”打印,而不是两个。

实际发生的是打印出“完成”,然后打印“原始完成”。

这意味着第二个子shell或者(a)不使用与第一个子shell相同的锁,或者(b)它没有获得锁,而是继续执行或者(c)其他。

为什么这些锁没有像我所期望的那样工作?

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

 flock <params> && <do other stuff> 

所以

 ( ( flock -x 200 ; sleep 10 ; echo "original finished" ; ) 200>./test.lock ) & ( sleep 2 ; ( flock -x -w 2 200 && echo "a finished" ) 200>./test.lock ) & 

做你想要的。