XARGS -N选项可以实现并行性和更少的处理时间



我试图了解如何使用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&&回声" {},在线">> healthcheck.log ||回声" {},离线">> healthcheck.log'

我可以通过制作-n2加快处理加速吗?我知道我可以使用-P4之类的东西来实现并行性,但是,无法理解如何将-n用于我的用例。

考虑以下代码:

xargs -d $'n' -P2 -n2 
  /bin/bash -c '
    for arg do
      if curl --fail -I "http://localhost/$arg" &>/dev/null; then
        printf "%s,Onlinen" "$arg"
      else
        printf "%s,Offlinen" "$arg"
      fi
    done
  ' _ >>healthcheck.log <URI.csv
  • xargs -d $'n'告诉gnu xargs逐条操作,而不是将输入文件分为单词,试图尊重报价,否则使用比实际上想要的更复杂的解析。
  • xargs -P 2指定您一次运行两个进程。按照您的意愿进行调整。
  • xargs -n 2指定每个过程都可以运行两个URL。按照您的意愿进行调整。
  • bash -c '...' _ arg1 arg2$0中使用_arg1中的CC_12运行脚本...$1中的CC_14,arg2$2中等等。
  • foo && bar || baz ACTS if foo; then bar; else baz; fi一样有点,但这并不相同。参见Bashpitfalls#22。
  • 请注意,我们只为Write 曾经打开healthcheck.log ,对于整个复合命令,而不是每次我们要为其写一行时重新打开文件。

使用gnu并行它看起来像:

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并行该作业将并行运行,但是对healthcheck.log的输出将被序列化,并且您将永远不会看到竞赛条件,在该条件下,两个作业同时写入日志,这可能会弄乱日志文件。在此示例中,accountedit同时撰写:

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

这将永远不会发生在GNU并行的输出中。

最新更新