我有一个bash脚本runner.sh
,它会调用另一个script.sh
。 script.sh
仅从runner.sh
被调用。我一次只能执行script.sh
的一个实例。如果对runner.sh
进行了多次调用,则runner.sh
应该在script.sh
已经运行的情况下使所有调用者都等待。 script.sh
完成后,它将允许等待的呼叫者之一执行script.sh
。
有人可以建议实现这一目标的一些方法吗?
答案 0 :(得分:3)
来自man flock:
[“ $ {FLOCKER}”!=“ $ 0”] && exec env FLOCKER =“ $ 0” flock -en“ $ 0”“ $ 0” “ $ @” || :
这是用于shell脚本的有用的样板代码。放在 您要锁定的Shell脚本的顶部,它将自动 在第一次运行时锁定自己。如果env var $ FLOCKER未设置为 正在运行的shell脚本,然后执行flock并抓取一个 排他非阻塞锁(使用脚本本身作为锁文件) 然后使用正确的参数重新执行。它还设置了 将FLOCKER env var设置为正确的值,这样它就不会再次运行。
将其放在./script.sh
之上(或runner.sh
之上),您就可以了。