Отправить пакетные / многопоточные запросы, используя bash и curl - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть случай, когда я хочу отправить пакет запросов. Мой текущий скрипт отправляет запрос последовательно, но я хочу иметь возможность отправить пакет запросов (все сразу) и ждать ответа (например, если я введу 10 в качестве количества запросов - все 10 должны быть отправлены все вместе). Я не уверен, как мне этого добиться, используя bash и curl. Любые идеи будут оценены.

#!/bin/bash

CURL="/usr/bin/curl"
echo -n "how many times you want to run the request: "
read erc
ERC="$erc"
#count=1;
total_connect=0
total_start=0
total_time=0
    echo " Time_Connect Time_startTransfer Time_total HTTP_Code ";
#while [ $count -le $ERC ]
for ((i=1;i<=$ERC;i+=1)); do
    result=`$CURL -k -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}:%{http_code} -H "Accept: application/xml" -H "Accept: text/xml" -H "Accept: application/json" -H "Accept: application/cbor" "http://google.com"`
    echo $result;

    var=$(echo $result | awk -F":" '{print $1, $2, $3, $4}')
    set -- $var

    total_connect=`echo "scale=6; $total_connect + $1"  | bc`;
    total_start=`echo "scale=6; $total_start + $2" | bc`;
    total_time=`echo "scale=6; $total_time + $3" | bc`;
    #count=$((count+1))
done
echo "URL executed is http://google.com"
echo "HTTP CODE of all request is $4"
echo "average time connect: `echo "scale=6; $total_connect/$ERC" | bc`";
echo "average time start: `echo "scale=6; $total_start/$ERC" | bc`";
echo "average Totaltime taken: `echo "scale=6; $total_time/$ERC" | bc`";

1 Ответ

0 голосов
/ 27 апреля 2020

Вот код с &, введенный для выдачи всех локонов "одновременно".

#!/bin/bash

CURL="/usr/bin/curl"
echo -n "how many times you want to run the request: "
read erc
ERC="$erc"
#count=1;
total_connect=0
total_start=0
total_time=0
    echo " Time_Connect Time_startTransfer Time_total HTTP_Code ";
#while [ $count -le $ERC ]
for ((i=1;i<=$ERC;i+=1)); do
  {
    result=`$CURL -k -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}:%{http_code} -H "Accept: application/xml" -H "Accept: text/xml" -H "Accept: application/json" -H "Accept: application/cbor" "http://google.com"`
    echo $result;

    var=$(echo $result | awk -F":" '{print $1, $2, $3, $4}')
    set -- $var

    total_connect=`echo "scale=6; $total_connect + $1"  | bc`;
    total_start=`echo "scale=6; $total_start + $2" | bc`;
    total_time=`echo "scale=6; $total_time + $3" | bc`;
    #count=$((count+1))
  } > $i.result &
done
wait
# TODO:  You'll need to write code here to process the intermediate results in *.result
# It would have been helpful to have created a temporary directory for your indivdual results as well
echo "URL executed is http://google.com"
echo "HTTP CODE of all request is $4"   
echo "average time connect: `echo "scale=6; $total_connect/$ERC" | bc`";
echo "average time start: `echo "scale=6; $total_start/$ERC" | bc`";
echo "average Totaltime taken: `echo "scale=6; $total_time/$ERC" | bc`";

Введенный мной wait говорит bash дождаться завершения всех дочерних процессов (завитки и тому подобное), прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...