我编写了一个 bash 脚本来遍历 txt 文件中的每个主机,并返回 HTTP 响应是否为 200 ok。但是它非常慢,我想通过设置超时来加快速度,等待主机。
我想我可以让它等待几秒钟 - 如果主机没有响应,它应该转到列表中的下一个主机。
我如何使用 bash 脚本来做到这一点,或者 – 如果这是一个坏主意 – 您能给我提供另一种解决方案吗?
我对 Bash 还很陌生。
for host in $(cat 'hackit.txt');
do
echo $host
curl -o /dev/null --silent --head --write-out '%{http_code}\n' $host
done
答案1
从man curl
:
-m,--最大时间
允许整个操作花费的最长时间(以秒为单位)。这对于防止批处理作业因网络速度慢或链接中断而挂起数小时非常有用。自 7.32.0 起,此选项接受十进制值,但实际超时的准确性会随着指定超时的十进制精度增加而降低。
和:
--连接超时
允许 curl 连接所用的最长时间(以秒为单位)。这仅限制连接阶段,因此如果 curl 在给定时间内连接,它将继续 - 否则它将退出。自版本 7.32.0 起,此选项接受十进制值。
也就是说,您也可以将其与@slhckparallel
建议相结合以并行运行查询。
答案2
你可以使用GNUparallel
为此。它有一个超时选项,可以终止单个作业,您还可以并行处理 URL,从而大大加快作业速度。
例如如果你有一个列表:
$ cat urls.txt
http://example.com
http://example.com/foo
http://example.com/?blah
http://some-non-existing-host.com/
curl
使用以下命令运行parallel
:
$ parallel --timeout 5 "curl -o /dev/null --silent --head --write-out '%{url_effective} %{http_code}\n' {}" < urls.txt 2> /dev/null
http://some-non-existing-host.com/ 000
http://example.com 200
http://example.com/?blah 200
http://example.com/foo 404
笔记:
--timeout 5
5 秒后终止每个单独的作业。- 我修改了该
--write-out
选项,以便它将 URL 和状态代码打印在一行中,并以空格分隔。这样您就可以更好地解析结果。 - 您可以使用 将结果重定向到文件
> results.txt
。 - 需要
2> /dev/null
抑制有关超时作业的警告。 - 这些作业并非按照原始列表中给出的顺序执行,但这并不重要。