代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

如果获取锁失败,为什么不使用超时退出来攻击集群呢?

  •  2
  • Amandasaurus  · 技术社区  · 14 年前

    我在玩使用 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 's man page .

    我希望第一个子shell在test.lock上获得一个独占锁,然后等待10秒,然后打印“原始完成”,一直持有该锁。第二个子shell将以相同的时间开始,等待2秒,然后尝试在test.lock上获取锁,但在2秒后超时。如果它得到一个锁,那么它将打印“A finished”。如果没有得到锁,那么子shell应该停止,不应该打印任何内容。

    由于第一个子shell等待的时间更长,它将保持锁10秒,因此第二个子shell不应该获得锁,也不应该完成。也就是说,一个人应该看到“原始完成”印刷和 两者都有。

    实际发生的情况是,先打印“已完成”,然后再打印“原始完成”。

    这意味着第二个子shell要么(a)不使用与第一个子shell相同的锁,要么(b)它无法获取锁,但继续执行,要么(c)其他东西。

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

    1 回复  |  直到 14 年前
        1
  •  5
  •   psmears Touffy    14 年前

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

    做你想做的。