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の回答を待っています)
答え2
最も簡単な解決策は、ループを関数の外に移動し、バックグラウンドで関数を実行することです。
#!/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でテストが開始され、バックグラウンドで送信コマンドが使用されるため、テストが開始され&
ます。ほぼ同時に。ミリ秒精度が必要ない場合はこれで十分です。
答え3
すでに回答を受け入れていますが。私の考えでは、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アドレスを含むファイルがあるとします。