Как запустить одну команду на разных удаленных машинах в один и тот же момент времени

Цифры, которые вы используете, кажутся слишком большими для bash. Вы можете попробовать что-то вроде:

#!/bin/bash
SIZE=$(redis-cli info |  awk -F':' '$1=="used_memory" {print int($2/1000)}')
MAX=19000000
if [ "$SIZE" -gt "$MAX" ]; then
    echo 123
fi
0
19.02.2020, 14:33
3 ответа

Попробуйте это,

#!/bin/bash

IP_Addresses=(192.168.2.33 192.168.2.34 192.168.2.35)

triggerPerformanceTest(){ 
        iplist=$1
        LOG=/tmp/$iplist.log
        echo "Validating the health end point in the remote server"  >> $LOG
        HTTP_RESPONSE=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
            if [ $HTTP_STATUS -eq 200  ] && [ $HTTP_BODY = "OK" ]; then
                echo "Success!! it seems the health service is ruuning in the target machine" >> $LOG
                echo "Starting the Jmeter Test" >> $LOG
            else
                echo "The health end point of the nodejs service return exit code 1, let the service start on the remote host" >> $LOG
                sleep 20
                HTTP_RESPONSE_NEW=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
                HTTP_STATUS_NEW=$(echo $HTTP_RESPONSE_NEW | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
                HTTP_BODY_NEW=$(echo $HTTP_RESPONSE_NEW | sed -e 's/HTTPSTATUS\:.*//g')
                count=2
                echo "Re-validating the health end point in the remote server" >> $LOG
                    while [ $HTTP_STATUS_NEW -ne 200 ] && [ $HTTP_BODY_NEW != "OK" ]
                    do
                        echo "Waiting for the Node-js service to start on the remote server" >> $LOG
                        sleep 5
                        HTTP_RESPONSE_FINAL=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
                        HTTP_STATUS_FINAL=$(echo $HTTP_RESPONSE_NEW | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
                        HTTP_BODY_FINAL=$(echo $HTTP_RESPONSE_NEW | sed -e 's/HTTPSTATUS\:.*//g')
                        $HTTP_STATUS_NEW=$((HTTP_STATUS_FINAL))
                        $HTTP_BODY_NEW=$((HTTP_BODY_FINAL))
                        count=`expr $count + 1`
                            if [ $count -eq 0 ]
                            then   
                                break
                            else
                                continue
                            fi
                    done
                        echo "Starting the Jmeter Test" >> $LOG
            fi
}
for ip in ${IP_Addresses[@]}
do
    triggerPerformanceTest "$ip" &
done

Дайте мне знать, если это работает так, как вы ожидали.

Сообщение

echoбудет доступно по адресу /tmp/$iplist.log

.

(Редактирование....жду ответа ОП)

0
28.04.2021, 23:22

Самое простое решение — убрать цикл из вашей функции и просто запустить функцию в фоновом режиме:

#!/bin/sh


triggerPerformanceTest(){ 
  thisIp=$1
  ## the rest of your tests. Just use $thisIp the way you were using
  ## the $iplist variable.
}

IP_Addresses="192.168.2.33,192.168.2.34,192.168.2.35"
for ip in $IP_Addresses; do
    triggerPerformanceTest "$ip" &
}

Это запустит тест на каждом IP-адресе, и, поскольку вы отправляете команду в фоновом режиме с &, они будут запущены на почти в одно и то же время. Если вам не нужна миллисекундная точность, этого должно быть достаточно.

0
28.04.2021, 23:22

Хотя вы приняли ответ. Я думаю, вы также можете добиться этого, используя команду parallel

#!/bin/sh

IP_Addresses=(192.168.2.33,192.168.2.34,192.168.2.35)

triggerPerformanceTest(){ 
    for iplist in $(echo $IP_Addresses | sed "s/,/ /g")
    do
        echo "Validating the health end point in the remote server"    
        HTTP_RESPONSE=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
            if [ $HTTP_STATUS -eq 200  ] && [ $HTTP_BODY = "OK" ]; then
                echo "Success!! it seems the health service is ruuning in the target machine"
                echo "Starting the Jmeter Test"
            else
                echo "The health end point of the nodejs service return exit code 1, let the service start on the remote host"
                sleep 20
                HTTP_RESPONSE_NEW=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
                HTTP_STATUS_NEW=$(echo $HTTP_RESPONSE_NEW | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
                HTTP_BODY_NEW=$(echo $HTTP_RESPONSE_NEW | sed -e 's/HTTPSTATUS\:.*//g')
                count=2
                echo "Re-validating the health end point in the remote server"
                    while [ $HTTP_STATUS_NEW -ne 200 ] && [ $HTTP_BODY_NEW != "OK" ]
                    do
                        echo "Waiting for the Node-js service to start on the remote server"
                        sleep 5
                        HTTP_RESPONSE_FINAL=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://${iplist}:9096/health)
                        HTTP_STATUS_FINAL=$(echo $HTTP_RESPONSE_NEW | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
                        HTTP_BODY_FINAL=$(echo $HTTP_RESPONSE_NEW | sed -e 's/HTTPSTATUS\:.*//g')

                        count=`expr $count + 1`
                            if [ $count -eq 0 ]
                            then   
                                break
                            else
                                continue
                            fi
                    done
                        echo "Starting the Jmeter Test"
            fi
    done
}

cat IP_Addresses_file | parallel triggerPerformanceTest {}

Предположим, у вас есть файл с именем IP_Addresses_file, содержащий все IP-адреса.

0
28.04.2021, 23:22

Теги

Похожие вопросы