以下锁定机制用于防止
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
但没有成功。
flock -n -e 200 || exit 1
flock -n
通过返回失败代码(零以外的代码)告诉您失败。 您可以在脚本顶部执行 set -e
,使其在看到任何未经检查的错误时退出。
根据您的应用程序,您可能希望在无法获取锁时
exit 0
指示成功。
我们对脚本文件本身使用排它锁,
$0
是命令文件的名称。
exec 200<$0
flock -n 200 || exit 1
整个解决方案只有两行代码。但诀窍是打开 $0 进行读取,然后为其获取独占锁。
flock
手册页的单行示例将其放在脚本的顶部:
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
解释:
这是 shell 脚本有用的样板代码。将其放在要锁定的 shell 脚本的顶部,它会在第一次运行时自动锁定自身。如果环境变量$FLOCKER未设置为正在运行的shell脚本,则执行flock并获取独占非阻塞锁(使用脚本本身作为锁定文件),然后使用正确的参数重新执行自身。它还将 FLOCKER 环境变量设置为正确的值,这样它就不会再次运行。