1. ホーム
  2. bash

[解決済み] Curl:応答を待たない[重複]。

2022-02-17 21:58:32

質問

現在、このようなcurlコマンドに依存するシェルスクリプトを持っています。

curl --request POST -u name:pass -H "Content-Type: application/json"
 --data "{data}" https://url.com --cacert ./my_crt

コマンドの応答は必要ありませんし、このコマンドは大きなforループの中にあるので、応答を待つのに多くの時間がかかります。

ということで、bashで全く同じことを、応答を待たずに行う方法はないでしょうか?

どのように解決するのですか?

早く発行したいリクエストが大量にあり、出力にはこだわらない場合、やるべきことは2つあります。

  1. 同じ接続でより多くのリクエストを行う。

小さなリクエストであれば、1つのコネクションで10リクエストずつ行う方が、10コネクションで1リクエストずつ行うよりもずっと速いのが一般的です。例えば ヘンリーのHTTPポストテストサーバー その差は2.5倍です。

$ time for i in {1..10}; do
    curl -F foo=bar https://posttestserver.com/post.php ;
  done
Successfully dumped 1 post variables.
View it at http://www.posttestserver.com/data/2016/06/09/11.44.48536583865
Post body was 0 chars long.
(...)
real    0m2.429s

$ time  {
    array=();
    for i in {1..10}; do
      array+=(--next -F foo=bar https://posttestserver.com/post.php ) ; 
    done; 
    curl "${array[@]}";
 }
Successfully dumped 1 post variables.
View it at http://www.posttestserver.com/data/2016/06/09/11.45.461371907842
(...)
real    0m1.079s

  1. 最大でN個のコネクションを並列処理 ホストや自分のマシンがDoSにならないようにするためです。

ここで sem GNU parallel からは、並列接続数を 4 に制限しています。 これは、常にフルキャパシティを確保するため、バックグラウンドと待機のより良いバージョンです。

for i in {1..20}
do 
  sem -j 4 curl -F foo=bar https://posttestserver.com/post.php
done
sem --wait

並列リクエストの数は、ホストの処理能力の高さに依存します。現実的な数は 32+ です。

この2つの戦略を組み合わせることで、DoSを起こさずに大幅なスピードアップを実現することができます。