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

时间:2017-09-10 05:29:30

标签: bash unix lockfile

我希望防止其他终端运行某个脚本,无论何时另一个终端正在运行它,但是在bash但是我不太确定我将如何进行这样做。任何帮助或提示都不胜感激!

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

3 个答案:

答案 0 :(得分:2)

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

<强>更新
我从Randal L. Schwartz {{3}}找到了一个非常聪明的方法。我真的很喜欢这一个。它依赖于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

答案 1 :(得分:1)

您可以使用&#34;锁定文件的概念。&#34;例如:

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

# ... the rest of your code

rm ~/.mylock

为了获得更好/更安全,你可以&#34;陷阱&#34; EXIT信号在结尾处自动删除它:

trap 'rm ~/.mylock' EXIT

答案 2 :(得分:1)

使用flock并将其置于脚本之上:

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

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