【问题标题】:bash flock: exit if can't acquire lockbash羊群:如果无法获得锁则退出
【发布时间】:2011-10-26 19:11:41
【问题描述】:

以下锁定机制用于防止cron 作业同时运行:

#!/bin/bash

echo "Before critical section"
(
    flock -e 200
    echo "In critical section"
    sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"

当同时运行两个实例时,后者会等到第一个完成,然后再运行。这可能会导致等待运行的脚本积压。

如何更改此脚本,以便如果flock 无法获取锁,它会终止脚本?我试过-n 没有成功。

【问题讨论】:

    标签: bash concurrency flock


    【解决方案1】:
    flock -n -e 200 || exit 1
    

    flock -n 通过返回一个失败代码(不是零)告诉你它失败了。您可以改为在脚本顶部执行 set -e 以使其在看到任何未检查的错误时退出。

    根据您的应用程序,您可能希望exit 0 在无法获取锁时表示成功。

    【讨论】:

      【解决方案2】:

      我们对脚本文件本身使用排他锁,$0是命令文件的名称。

      exec 200<$0
      flock -n 200 || exit 1
      

      整个解决方案只有两行代码。但诀窍是打开 $0 进行读取,然后为其获取排他锁。

      【讨论】:

      • 最好记录下失败的案例。我怀疑如果$0 包含空格,它会失败,如果$0 不包含运行脚本的路径(例如,脚本在别处但在PATH),它将失败。
      • $0 如果在 $PATH 中,它应该仍然有路径。它不起作用的一种情况是在破折号下。
      • exec 200
      • 如果您想知道数字 200 有什么特别之处:stackoverflow.com/a/13551882/1456173
      猜你喜欢
      • 2011-02-23
      • 2011-02-07
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2012-06-14
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多