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进行阅读,然后获得排他锁.