1

我想阻止其他终端在另一个终端运行某个脚本时运行它,但是在 bash 中,但我不太确定我将如何去做。任何帮助或提示将不胜感激!

例如:当该脚本在另一个终端上运行时,所有其他终端也将无法运行该特定脚本。并显示一条消息“正在维护”。

4

3 回答 3

2

您可以使用“锁定文件”的概念。例如:

if [ -f ~/.mylock ]; then
    echo "UNDER MAINTENANCE"
    exit 1
fi
touch ~/.mylock

# ... the rest of your code

rm ~/.mylock

为了获得更好/更安全,您可以“捕获”EXIT信号以在最后自动将其删除:

trap 'rm ~/.mylock' EXIT
于 2017-09-10T05:34:00.217 回答
2

为避免竞争条件,您可以flock(1)与锁定文件一起使用。有一个flock(1) 实现 声称可以在Linux、BSD 和OS X 上运行。我还没有看到一个明确的Unix 实现。这里
有一些有趣的讨论。

更新:我在这里
找到了 Randal L. Schwartz 的一个非常聪明的方法。我真的很喜欢这一个。它依赖于and ,并且它使用脚本本身作为自己的锁文件。看一下这个:flock(1)bash

/usr/local/bin/onlyOne是获取锁的脚本

#!/bin/bash
exec 200< $0
if ! flock -n 200; then
    echo "there can be only one"
    exit 1
fi

然后myscript用于onlyOne获取锁(或不锁):

#!/bin/bash
source /usr/local/bin/onlyOne
# The real work goes here.
echo "${BASHPID} working"
sleep 120
于 2017-09-11T18:41:58.570 回答
2

使用flock并将其放在脚本之上:

if ! flock -xn /path/to/lockfile ; then
    echo "script is already running."
    echo "Aborting."
    exit 1
fi

注意:path/to/lockfile可能是脚本的路径。这样做可以避免创建额外的文件。

于 2017-09-11T18:54:35.060 回答