使用 Bash 脚本启动多个查询

使用 Bash 脚本启动多个查询

我有以下 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 &

并行运行它。注意:他们应该使用不同的日志文件。

相关内容