3

我正在玩 using 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 ) &

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

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

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

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

这意味着第二个子shell要么(a)没有使用与第一个子shell相同的锁,要么(b)它未能获得锁,但继续执行,或者(c)其他东西。

为什么这些锁不能按我的预期工作?

4

1 回答 1

6

问题是,如果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 ) &

做你想做的事。

于 2010-05-24T11:43:44.730 回答