xargs -n选项实现并行性和更少的处理时间

时间:2018-04-03 15:03:29

标签: bash xargs

我试图了解如何使用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如何用于我的用例。

2 个答案:

答案 0 :(得分:1)

请考虑以下代码:

xargs -d $'\n'
  • xargs告诉GNU xargs -P 2逐行操作,而不是将输入文件分成单词,尝试表达引号,否则使用比你想象的更复杂的解析。
  • xargs -n 2指定您一次运行两个进程。按你的意愿调整它。
  • bash -c '...' _ arg1 arg2指定为每个进程提供两个要运行的URL。按你的意愿调整它。
  • ...使用_中的$0arg1中的$1arg2$2运行脚本xargs因此,for arg do附加的参数成为脚本的位置参数,foo && bar || baz迭代。
  • if foo; then bar; else baz; fi行为一点,如healthcheck.log,但它并不完全相同。见BashPitfalls #22
  • 请注意,对于整个复合命令,我们只为一次打开{{1}},而不是每次我们想要向其写入一行时重新打开文件

答案 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的输出将被序列化,您将永远不会看到竞争条件,其中两个作业同时写入日志,这可能会弄乱日志文件。在此示例中,accountedit同时写道:

signup,Online
accouedit,Online
nt,Offline
close,Online

这绝不会发生在GNU Parallel的输出中。