首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Bash脚本启动多个查询

使用Bash脚本启动多个查询
EN

Unix & Linux用户
提问于 2019-08-30 20:27:18
回答 2查看 292关注 0票数 4

我有以下bash脚本(在这个岗位上):

代码语言:javascript
复制
#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < infile > outfile

幼稚:

代码语言:javascript
复制
google.com
facebook.com

外档案:

代码语言:javascript
复制
301 amazon.com
302 facebook.com

问题:它非常慢,因为它逐行验证。

测试:我已经尝试过其他选择,例如福平 (考虑到列表的大小非常有限)、吡咯 (冻结)、惠特GNU并行等等。这里是一种带有xargs的解决方案,但是输出与原始脚本不同。

问题:如何使用此脚本启动多个查询(并行处理),以便同时处理多行(如果可以手动设置要处理的行数,避免冻结或阻塞脚本或PC)?

更新:已解决!谢谢

代码语言:javascript
复制
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile

PD:"-P 3“实例数

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-09-06 20:59:46

由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_写入_使用_沙格_-P (来自xargs风险中的并行作业的输出混合在一起),我将使用GNU并行:

代码语言:javascript
复制
cat infile |
  parallel -P0 -q curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile

在这种特殊情况下,使用xargs可能是安全的,因为输出太短,所以使用xargs的问题是,如果稍后有人更改代码来做更大的事情,那么它就不再安全了。或者,如果有人读到这个问题,认为他可以用其他东西代替curl,那么这也是不安全的。

这可能会更快:

代码语言:javascript
复制
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
EN

Unix & Linux用户

发布于 2019-08-30 22:30:30

您可以将url列表分成10个部分,并使用主脚本ala

代码语言:javascript
复制
./subscript1.sh &
./subscript2.sh &
...
./subscript10.sh &

并行运行。警告:他们应该使用不同的日志文件。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/538340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档