以下锁定机制用于防止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
没有成功。
答案 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进行阅读,然后获得排他锁。