我有以下 bash 脚本(在这篇文章中):
#!/bin/bash
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < infile > outfile
文件:
google.com
facebook.com
输出文件:
301 amazon.com
302 facebook.com
问题:它非常慢,因为它逐行验证。
测试:我已经尝试过其他替代方案,例如fping(考虑到列表的大小非常有限)、pyfunceble(冻结)、wget、GNU parallel等。没有人说服我。这是一个带有xargs的解决方案,但输出与原始脚本不同
问题:如何使用此脚本启动多个查询(并行处理),以便我可以同时处理多行(如果可以手动设置要处理的行数,避免冻结或阻塞脚本或个人电脑)?
更新:解决了!谢谢
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
PD:“-P 3”实例数
由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(并行作业的输出
xargs
存在混合风险),我会改用 GNU Parallel:在这种特殊情况下,使用它可能是安全的,
xargs
因为输出很短,所以使用的问题xargs
在于,如果以后有人更改代码以做更大的事情,它将不再安全。或者,如果有人阅读了这个问题并认为他可以curl
用其他东西代替,那么这也可能不安全。这可能会更快:
您可以将您的 url 列表分成 10 个部分并使用主脚本 ala
并行运行它。注意:他们应该使用不同的日志文件。