Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用gnu并行执行for循环_Linux_Bash_Shell_Parallel Processing_Scripting - Fatal编程技术网

Linux 使用gnu并行执行for循环

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

我想使用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 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