我希望防止其他终端运行某个脚本,无论何时另一个终端正在运行它,但是在bash但是我不太确定我将如何进行这样做。任何帮助或提示都不胜感激!
在示例中: 当该脚本在另一个终端上运行时,所有其他终端也将无法运行该特定脚本。并显示“维护不足”的信息。
答案 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
可能是您脚本的路径。这样做可以避免创建额外的文件。