卷毛:不要等待回应

时间:2016-06-09 16:32:54

标签: bash shell

我目前有一个shell脚本,它依赖于像这样的curl命令:

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

我不需要命令的响应,而且这个命令是一个很大的for循环,所以等待响应会花费很多时间。

那么,在bash中有没有办法做同样的事情,但是没有等待响应?

2 个答案:

答案 0 :(得分:8)

您可以使用&对其进行后台处理,为防止输出,您可以将stdoutstderr重定向到/dev/null

curl --request POST -u name:pass -H "Content-Type: application/json" \
     --data "{data}" https://url.com --cacert ./my_crt > /dev/null 2>&1 &

答案 1 :(得分:8)

如果您想要快速发出大量请求,并且您不关心输出,那么您应该做两件事:

  1. 使用相同的连接执行更多请求。
  2. 对于小型请求,在1个连接上每次请求10个请求通常要快得多,而在10个连接上每个请求1个请求通常要快得多。对于Henry's HTTP post test server,差异为2.5x:

    $ 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
    

    VS

    $ 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
    2. 这里来自GNU parallel的sem将并行连接的数量限制为4.这是一个更好的后台和等待版本,因为它将始终确保满容量。

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

      您想要的并行请求数取决于主机的强大程度。实际数字可以是32 +

      结合这两种策略,你应该看到没有DoS和自己的高速加速。