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

Ror*_*ory 2 unix linux bash flock

我正在使用flock一个用于文件锁定的bash命令来防止两个不同的代码实例运行多次.

我正在使用此测试代码:

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

我正在运行2个子壳(背景).该(flock NUM; ...) NUM>FILE语法是从flock的人页面.

我希望第一个子shell将获得test.lock的独占锁,然后等待10秒,然后打印"原始完成",一直持有锁.第二个子shell将在或多或少同时启动,等待2秒,然后尝试锁定test.lock,但在2秒后超时.如果它获得锁定,那么它将打印"完成".如果它没有锁定,则该子shell应该停止,并且不应打印任何内容.

由于第一个子shell等待的时间较长,因此它将保持锁定10秒,因此第二个子shell不应该获得锁定,并且不应该完成.即应该看到"原始完成"打印而不是两者.

实际发生的是打印"完成",然后打印"原始完成".

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

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

psm*_*ars 5

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

flock <params> && <do other stuff>
Run Code Online (Sandbox Code Playgroud)

所以

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

做你想要的.