我目前有一个shell脚本,它依赖于像这样的curl命令:
curl --request POST -u name:pass -H "Content-Type: application/json"
--data "{data}" https://url.com --cacert ./my_crt
我不需要命令的响应,而且这个命令是一个很大的for循环,所以等待响应会花费很多时间。
那么,在bash中有没有办法做同样的事情,但是没有等待响应?
答案 0 :(得分:8)
您可以使用&
对其进行后台处理,为防止输出,您可以将stdout
和stderr
重定向到/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个连接上每次请求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
这里来自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和自己的高速加速。