Bash flock: 如果无法获取锁则退出

17

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

#!/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但没有成功。

2个回答

22
flock -n -e 200 || exit 1

flock -n 返回一个失败代码(非零),告诉你它失败了。如果你想让脚本在遇到任何未检查的错误时退出,你可以在脚本顶部使用set -e

根据你的应用程序,当无法获取锁时,你可能想要使用exit 0 来表示成功。


14

我们在脚本文件本身上使用独占锁,$0 是命令文件的名称。

exec 200<$0
flock -n 200 || exit 1
整个解决方案只需两行代码。但关键是要打开$0进行读取,然后获取它的独占锁定。

2
最好记录一下这可能失败的情况。我怀疑如果$0包含空格,它将会失败,并且如果$0不包含运行脚本的路径(例如脚本在其他地方但是在PATH中),它也会失败。 - joeytwiddle
$0 应该仍然具有路径,如果它在 $PATH 中。一个不起作用的情况是在破折号下。 - steveayre
exec 200<"$0" # <- 双引号可以避免上述空格字符问题 - Gunar Gessner
如果你想知道数字200有什么特别之处:https://dev59.com/u2Yr5IYBdhLWcg3wmLNk#13551882 - Gunar Gessner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接