Linux 使用gnu并行执行for循环
我想使用gnu并行来执行for循环中bash脚本中的一个函数,但我无法从我在线获得的信息中弄清楚是如何实现的。 例如:Linux 使用gnu并行执行for循环,linux,bash,shell,parallel-processing,scripting,Linux,Bash,Shell,Parallel Processing,Scripting,我想使用gnu并行来执行for循环中bash脚本中的一个函数,但我无法从我在线获得的信息中弄清楚是如何实现的。 例如: #!/bin/bash get_racks(){ query that outputs a list of racks } get_hosts() { query that outputs a list of hosts by rack(passed as param to the func) } get_gw() { query that outputs a list
#!/bin/bash
get_racks(){
query that outputs a list of racks
}
get_hosts() {
query that outputs a list of hosts by rack(passed as param to the func)
}
get_gw() {
query that outputs a list of gateways
}
check_ping() {
HOSTS=(`get_hosts`)
COUNTER=0
while [ $COUNTER -lt $SIZE ] ; do
ssh $HOSTS "ping -c 5 ${GATEWAYS[$COUNTER]} " ;
COUNTER=$((COUNTER+1)) ;
done
}
RACKS=(`get_racks`)
HOSTS=(`get_hosts`)
GWS=(`get_gw`)
SIZE=${#GWS[@]}
COUNTER=0
for rack in ${RACKS[@]}; do
parallel check_ping | tee output.txt
done
我希望并行执行for循环和内部发生的事情,同时控制并发作业的数量,并将所有内容输出到单个文件中。最后一个文件应该包含函数返回的所有数据,并打印到标准输出。
此外,check_ping还有一部分是对远程机器进行sshing并ping一个GW,这一部分实际上与一个自定义ssh命令并行进行,我们将ssh并行地发送到阵列中的所有主机并ping一个GW
非常感谢我想你想要这个:
RUN_COMMANDS() {
...
}
export -f RUN_COMMANDS
parallel -j4 RUN_COMMANDS ::: “${FILES[@]}” | tee output.txt
如果顺序很重要,您将需要
parallel-k…
。parallel可以以非常类似于xargs的方式使用,它甚至实现了xargs的参数
#!/bin/bash
RUN_COMMANDS(){
......
}
FILES=(file1 file2 file3)
echo ${FILES[@]} | parallel RUN_COMMANDS | tee output.txt
如果您有更多的函数/变量/别名,那么请考虑使用<代码> Envia Simule。这样,
env_parallel
将为您执行导出操作。Oops,在此处添加一个空格RUN_COMMANDS(){
很抱歉,这是我的伪代码中的语法错误,实际代码没有问题。我仍然收到此错误。我假设您确实在使用bash
?如果仍然收到错误,请单击原始问题下的编辑
,并粘贴实际代码和实际错误,以便其他人可以进一步帮助您。您需要export-f check_ping
在并行之前几行的某个地方…谢谢@OleTange的回答,但是我得到了/bin/bash:ping gw:command not found
。我在另一个线程中读到,你说这可能是由于并行版本的错误造成的?你在复制全文吗?我刚刚在GNU的所有版本上进行了测试自2014年开始并行。它们都能工作。GNU并行中不太可能出现错误。是的,仍然返回未找到的命令。我正在以常规用户帐户运行它。很可能您的环境中出现了问题。请查看是否可以在以下任何一项上重现错误:
#!/bin/bash
get_racks(){
# query that outputs a list of racks
echo rack01
}
export -f get_racks
get_hosts() {
# query that outputs a list of hosts by rack(passed as param to the func)
echo host01
echo host02
}
export -f get_hosts
get_gw() {
# query that outputs a list of gateways
echo gw1
echo gw2
}
export -f get_gw
ping_gw() {
rack="$1"
get_hosts "$rack" | parallel -S - --onall ping -c 5 ::: "`get_gw`"
}
export -f ping_gw
get_racks | parallel ping_gw && echo All hosts and gws are up