17

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

4

2 回答 2

22
flock -n -e 200 || exit 1

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

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

于 2011-08-14T14:29:56.697 回答
14

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

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

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

于 2011-09-05T08:15:46.690 回答