我试图了解如何使用xargs
-n
选项循环csv文件并运行CURL操作以将输出收集到文件以实现更快的处理时间。
示例:
我需要根据带有URI(其中1000个)的CSV文件来检查网页健康状况。
URI.csv
signup
account
edit
close
我正在尝试并行检查他们的状态,使用:
cat URI.csv | xargs -n1 -I {} / bin / bash -c'curl -I http://localhost/ {}&> / dev / null&& echo“{},Online”>> healthcheck.log || echo“{},离线”>> healthcheck.log'
我可以通过制作-n2
来加快处理速度吗?我知道我可以使用-P4
之类的东西来实现并行性,但是,无法理解-n
如何用于我的用例。
答案 0 :(得分:1)
请考虑以下代码:
xargs -d $'\n'
xargs
告诉GNU xargs -P 2
逐行操作,而不是将输入文件分成单词,尝试表达引号,否则使用比你想象的更复杂的解析。 xargs -n 2
指定您一次运行两个进程。按你的意愿调整它。bash -c '...' _ arg1 arg2
指定为每个进程提供两个要运行的URL。按你的意愿调整它。...
使用_
中的$0
,arg1
中的$1
,arg2
中$2
运行脚本xargs
因此,for arg do
附加的参数成为脚本的位置参数,foo && bar || baz
迭代。if foo; then bar; else baz; fi
行为一点,如healthcheck.log
,但它并不完全相同。见BashPitfalls #22。答案 1 :(得分:0)
使用GNU Parallel看起来像这样:
cat URI.csv |
parallel -j100 'curl -I http://localhost/{} &> /dev/null && echo {}",Online" || echo {}",Offline"' >>healthcheck.log
或者更容易阅读:
#!/bin/bash
doit() {
if curl -I http://localhost/"$1" &> /dev/null ; then
echo "$1,Online"
else
echo "$1,Offline"
fi
}
export -f doit
cat URI.csv | parallel -j100 doit >>healthcheck.log
将-j100
调整为您想要并行运行的作业数量。
通过使用GNU Parallel,作业将并行运行,但healthcheck.log
的输出将被序列化,您将永远不会看到竞争条件,其中两个作业同时写入日志,这可能会弄乱日志文件。在此示例中,account
和edit
同时写道:
signup,Online
accouedit,Online
nt,Offline
close,Online
这绝不会发生在GNU Parallel的输出中。