我想阻止其他终端在另一个终端运行某个脚本时运行它,但是在 bash 中,但我不太确定我将如何去做。任何帮助或提示将不胜感激!
例如:当该脚本在另一个终端上运行时,所有其他终端也将无法运行该特定脚本。并显示一条消息“正在维护”。
您可以使用“锁定文件”的概念。例如:
if [ -f ~/.mylock ]; then
echo "UNDER MAINTENANCE"
exit 1
fi
touch ~/.mylock
# ... the rest of your code
rm ~/.mylock
为了获得更好/更安全,您可以“捕获”EXIT
信号以在最后自动将其删除:
trap 'rm ~/.mylock' EXIT
为避免竞争条件,您可以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
使用flock
并将其放在脚本之上:
if ! flock -xn /path/to/lockfile ; then
echo "script is already running."
echo "Aborting."
exit 1
fi
注意:path/to/lockfile
可能是脚本的路径。这样做可以避免创建额外的文件。