bash flock:退出如果无法获得锁定

时间:2011-08-14 13:58:57

标签: bash concurrency flock

以下锁定机制用于防止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没有成功。

2 个答案:

答案 0 :(得分:21)

flock -n -e 200 || exit 1

flock -n通过返回失败代码(非零值)告诉您失败。您可以在脚本顶部执行set -e,以便在看到任何未经检查的错误时退出。

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

答案 1 :(得分:12)

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

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

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