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

Ada*_*tan 17 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"
Run Code Online (Sandbox Code Playgroud)

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

如何更改此脚本以便在flock无法获取锁定时终止脚本?我试过-n没有成功.

Joh*_*nck 21

flock -n -e 200 || exit 1
Run Code Online (Sandbox Code Playgroud)

flock -n通过返回失败代码(零以外的东西)告诉你它失败了.您可以set -e在脚本顶部执行操作,以便在看到任何未经检查的错误时退出.

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


小智 13

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

exec 200<$0
flock -n 200 || exit 1
Run Code Online (Sandbox Code Playgroud)

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

  • 记录这种情况可能会失败的情况会很好.我怀疑如果`$ 0`包含空格会失败,如果`$ 0`不包含运行脚本的路径(例如脚本在其他地方但在`PATH`上),它将失败. (2认同)