阻止其他终端在另一个终端使用脚本时 运行

Prevent other terminals from running a script while another terminal is using it

我想阻止其他终端在另一个终端 运行 宁时 运行 宁某个脚本但是在 bash 但我不太确定我会怎么做能够去做。非常感谢任何帮助或提示!

例如: 当该脚本在另一个终端上 运行 时,所有其他终端也将无法 运行 该特定脚本。并显示消息 "UNDER MAINTENANCE".

你可以使用一个"lockfile."的概念例如:

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

# ... the rest of your code

rm ~/.mylock

要得到fancier/safer,可以"trap"EXIT信号在最后自动去掉:

trap 'rm ~/.mylock' EXIT

为避免竞争条件,您可以使用 flock(1) 和 锁定文件。有 one flock(1) implementation 它声称可以在 Linux、BSD 和 OS X 上工作。我还没有看到一个 明确用于 Unix。
有一些有趣的讨论

更新:
我从 Randal L. Schwartz here 那里找到了一个非常聪明的方法。我真的很喜欢这一个。它依赖于 flock(1)bash,并将脚本本身用作自己的锁定文件。检查一下:

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

#!/bin/bash
exec 200< [=10=]
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

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

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

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