我试图了解如何使用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'
告诉gnuxargs
逐条操作,而不是将输入文件分为单词,试图尊重报价,否则使用比实际上想要的更复杂的解析。 -
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
的输出将被序列化,并且您将永远不会看到竞赛条件,在该条件下,两个作业同时写入日志,这可能会弄乱日志文件。在此示例中,account
和edit
同时撰写:
signup,Online
accouedit,Online
nt,Offline
close,Online
这将永远不会发生在GNU并行的输出中。