我有以下 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
问题:它非常慢,因为它逐行验证。
测试:我已经尝试过其他替代方案,例如平(考虑到列表的大小,非常有限),pyfanceble(冻结),获取,GNU并行等等,没有一个能让我信服。和这里是用 xargs 的解决方案,但输出与原始脚本不同
问题:如何使用此脚本启动多个查询(并行处理),以便我可以同时处理多行(如果可以手动设置要处理的行数,避免冻结或阻止脚本或 PC) ?
更新:解决了!。谢谢
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
PD:“-P 3”实例数
答案1
由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(并行作业的输出存在xargs
混合风险),我会使用 GNU Parallel 代替:
cat infile |
parallel -P0 -q curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
在这种特殊情况下,使用它可能是安全的,xargs
因为输出很短,所以使用的问题xargs
在于,如果有人后来更改代码来做更大的事情,它将不再安全。或者,如果有人读到这个问题并认为他可以curl
用其他东西代替,那么这也可能不安全。
这可能会更快:
doit() {
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done
}
export -f doit
parallel -j0 --pipepart -a infile --block -10 doit > outfile
答案2
您可以将 url 列表分成 10 个部分,并使用主脚本 ala
./subscript1.sh &
./subscript2.sh &
...
./subscript10.sh &
并行运行它。注意:他们应该使用不同的日志文件。