正确使用&&并在bash中等待mutitasking

时间:2017-04-05 02:56:07

标签: bash curl multiprocessing

这是一个shell脚本,它使用域及其参数来查找状态代码。由于线程运行速度更快,但是错过了很多请求。

while IFS= read -r url <&3; do
    while IFS= read -r uri <&4; do
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri" >> urlstatus.txt &
done 4<uri.txt 
done 3<url.txt

如果我正常运行它会处理所有请求,但速度非常低。有没有一种方法可以保持速度,也不会错过所有请求。

1 个答案:

答案 0 :(得分:1)

您描述的症状听起来像程序之外的某些资源无法应对并行性,但您没有提供任何诊断来帮助解决此问题。如果您的本地网络带宽足够但远程服务器限制了您,那么您无法说服他们停止这样做,当然如果您的问题是由本地资源耗尽引起的,那么通过阻塞点(你的DNS服务器?)应该允许你继续进行而不需要任何实际的代码更改。

一个常见的解决方法是扼杀你的结果。使用xargsparallel运行受控数量的并行进程,而不是同时释放它们,以便在有限的资源上激烈竞争。

参见例如Bash: limit the number of concurrent jobs?了解如何在实践中做到这一点。

如果单独行动不足,可以在两次运行之间添加一个小sleep来平息事情。