如果其中一个发送回显,是否有办法停止同时运行的脚本?

时间:2019-06-24 15:10:17

标签: bash

我需要确定我拥有的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脚本上添加“退出”,但不会停止所有脚本。有人可以告诉我我想做什么吗?

2 个答案:

答案 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}}。