【问题标题】:Bash script to ensure only one instance of a script running & others waitingBash 脚本,以确保只有一个脚本实例在运行,其他实例在等待
【发布时间】:2018-11-05 16:43:34
【问题描述】:

我有一个 bash 脚本 runner.sh,它调用另一个 script.shscript.sh 仅从 runner.sh 调用。我一次只能执行一个script.sh 实例。如果多次调用runner.sh,那么如果script.sh 已经在运行,runner.sh 应该让所有调用者等待。一旦script.sh 完成,它将允许等待的调用者之一执行script.sh

有人可以提出一些实现这一目标的方法吗?

【问题讨论】:

    标签: linux bash ubuntu


    【解决方案1】:

    来自man flock

    [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

    这是用于 shell 脚本的有用样板代码。把它放在 您要锁定的 shell 脚本的顶部,它会自动锁定 在第一次运行时锁定自身。如果环境变量 $FLOCKER 未设置为 正在运行的shell脚本,然后执行flock并抓取一个 独占非阻塞锁(使用脚本本身作为锁文件) 在使用正确的参数重新执行之前。它还设置了 FLOCKER env var 设置为正确的值,因此它不会再次运行。

    把它放在./script.sh(或runner.sh)上面就可以了。

    【讨论】:

    • 如果无法获得锁,这不会失败而不是等待吗?为了让实例等待而不是失败,你不直接删除-n吗?
    • @PaulHodges - 如果我放弃-n,调用者会按照他们尝试调用锁定命令的顺序等待吗?或者顺序可以是随机的?
    • 取决于它的实现方式。不能说我知道。如果重要,值得进行一些研究。
    • 进程由调度器调度。在flock被释放后,无论哪个进程先获得CPU时间,都会获得锁并继续执行。简而言之:它是随机的。您需要创建类似“等待队列”的东西来让他们自己订购。
    • 然而,根据this thread 看来,他们被唤醒的顺序与被阻止的顺序相同。 The documentation doesn't require this but * it seems like the reasonable thing to do. 它仍然存在于 current kernel 中。所以我想你可以(目前)指望它们会在 Linux 内核上以相同的顺序唤醒。
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2011-01-15
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多