我需要确定我拥有的20台服务器中是否有一个值(实际上是比这更复杂的值)。而且我需要尽快完成。现在,我正在同时将脚本发送到所有服务器。我的主要脚本是这样的(但包含所有服务器):
#!/bin/sh
#mainScript.sh
value=$1
c1=`cat serverList | sed -n '1p'`
c2=`cat serverList | sed -n '2p'`
sh find.sh $value $c1 & sh find.sh $value $c2
#!/bin/sh
#find.sh
#some code here .....
if [ $? -eq 0 ]; then
rm $tempfile
else
myValue=`sed -n '/VALUE/p' $tempfile | awk 'BEGIN{FS="="} {print substr($2, 8, length($2)-2)}'`
echo "$myValue"
fi
因此,脚本仅在服务器中找到该值时才返回响应。我想知道如果其中一个脚本已经返回值,是否有办法停止执行其他脚本。
我尝试在find.sh脚本上添加“退出”,但不会停止所有脚本。有人可以告诉我我想做什么吗?
答案 0 :(得分:1)
我建议您使用一些可以帮助您解决此问题的方法:GNU Parallel。在链接的教程中:
如果您要寻找成功而不是失败,则可以使用成功。第一项工作成功后,该操作便会完成:
parallel -j2 --halt now,success=1 echo {}\; exit {} ::: 1 2 3 0 4 5 6
输出:
1
2
3
0
parallel: This job succeeded:
echo 0; exit 0
答案 1 :(得分:0)
我建议您从修改version
开始,使其返回代码取决于其成功,这将使我们更轻松地确定成功的呼叫;例如:
var config = require('config');
var myID = config.get('capsuleID');
var myVersion = config.get('version');
要终止脚本生成的所有find.sh
进程,可以将myValue=`sed -n '/VALUE/p' $tempfile | awk 'BEGIN{FS="="} {print substr($2, 8, length($2)-2)}'`
success=$?
echo "$myValue"
exit $success
与父进程ID条件和命令名称条件一起使用:
find.sh
请注意,这要求您直接启动pkill
脚本,而不是将其作为参数传递给pkill -P $$ find.sh # $$ refers to the current process' PID
。通常,这应该不成问题,但是如果您有充分的理由调用find.sh
而不是脚本,则可以将sh
命令中的sh
替换为find.sh
(假设您没有生成不想杀死的其他脚本)。
现在pkill
仅在找到期望的字符串时成功退出,您可以将两个动作插入sh
并在后台运行整个程序:
find.sh
成功终止的&&
的第一次出现将调用{ find.sh $value $c1 && pkill -P $$ find.sh; } &
命令,该命令将终止所有其他命令(那些被终止的进程将具有非零的退出代码,因此将不运行其关联的{ {1}}。