我有以下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问题:它非常慢,因为它逐行验证。
测试:我已经尝试过其他选择,例如福平 (考虑到列表的大小非常有限)、吡咯 (冻结)、惠特、GNU并行等等。这里是一种带有xargs的解决方案,但是输出与原始脚本不同。
问题:如何使用此脚本启动多个查询(并行处理),以便同时处理多行(如果可以手动设置要处理的行数,避免冻结或阻塞脚本或PC)?
更新:已解决!谢谢
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfilePD:"-P 3“实例数
发布于 2019-09-06 20:59:46
由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_写入_使用_沙格_-P (来自xargs风险中的并行作业的输出混合在一起),我将使用GNU并行:
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发布于 2019-08-30 22:30:30
您可以将url列表分成10个部分,并使用主脚本ala
./subscript1.sh &
./subscript2.sh &
...
./subscript10.sh &并行运行。警告:他们应该使用不同的日志文件。
https://unix.stackexchange.com/questions/538340
复制相似问题