単一の時点で複数のリモートシステムで単一のコマンドを実行する方法

単一の時点で複数のリモートシステムで単一のコマンドを実行する方法

3つの異なるコンピュータでパフォーマンステストをトリガーするためにループで実行される次のシェルスクリプトがあります。 3台のコンピュータで検証した後、同時にテストを実行したいと思います。同時に、3台のコンピュータにカールコマンドを送信するのと同じです。

#!/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
}

triggerPerformanceTest $IP_Addresses

だから私の計画は、これらの3つのカールコマンドを配列要素に入れて呼び出すことです。しかし、今は順番に呼び出されます。 3台のコンピュータで並列にトリガする方法はありますか?次のコマンドを一度に呼び出すのと同じです。

curl http://192.168.2.33:9096/triggerPerformanceTest
curl http://192.168.2.34:9096/triggerPerformanceTest
curl http://192.168.2.35:9096/triggerPerformanceTest

それともこの問題を解決するより良い方法はありますか?私が考えることができるのは、待ち時間テストをトリガするロジックをターゲットコンピュータに実装することです。つまり、最初のコンピュータは数ミリ秒のテスト待ち時間を持ち、2番目のコンピュータは1番目と3番目のコンピュータよりも短い待ち時間を持ちます(0)。 。

ベストアンサー1

この試み、

#!/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

(編集中…OPの回答を待っています)

おすすめ記事