我在远程主机xargs
中并行运行一些查询命令,这些命令运行效率很高,但是我在查找从哪个主机获取查询时遇到了一些问题。
现在正在执行此操作的脚本部分看起来完全像这样:
export commands="cmd1; cmd2; "
hosts=("host1" "host2" "host3" "host4")
MaxInstance=10
echo_var(){
echo "Executing in $1:"; sleep 1; echo "Output of: $commands"; return 0;
}
export -f echo_var
printf "%s\n" ${hosts[@]} | xargs -n 2 -P $MaxInstance -I {} $(command -v bash) -c 'echo_var "$1"' _ {}
由于以下原因,它应该输出如下sleep 1
:
Executing in host1:
Executing in host2:
Executing in host3:
Executing in host4:
Output of: cmd1; cmd2;
Output of: cmd1; cmd2;
Output of: cmd1; cmd2;
Output of: cmd1; cmd2;
为了实现可能看起来类似于最后显示的输出,我必须将现有函数编辑为以下内容以更接近我想要的。但即使在这里,如果我使用printf "%s\n%s" "$name" "$output"
,它有时会在新行中断。例如:
echo_var(){
name="Executing in $1:"; sleep 1; output="Output of: $commands";
echo -e "$name: $output" ## will work
# echo -e "$name\n$output" ## will not work or even
# printf "%s\n%s" "$name" "$output" ## will not work
return 0;
}
在不牺牲并行执行速度的情况下,我希望得到如下输出。是否有任何选项xargs
可以指定一次显示整个实例的输出?
Executing in host1:
Output of: cmd1; cmd2;
Executing in host2:
Output of: cmd1; cmd2;
Executing in host3:
Output of: cmd1; cmd2;
Executing in host4:
Output of: cmd1; cmd2;
认识GNU Parallel (
sudo apt install parallel
):我无法对其进行测试,但是您的命令应该只是:
请注意,该
moreutils
软件包提供了一个parallel
不同于 GNU 并行的命令。示例运行
此示例
echo {} start; sleep 1; echo {} ready
针对参数和运行1
,首先使用,然后使用:2
3
xargs
parallel
当然,该
echo |
方法确实适用于parallel
,我只是喜欢上面显示的参数列表功能 - 它完全相同。如果您
parallel
因为没有预装、难以安装/更新或类似的原因而犹豫使用,我强烈推荐程序作者的博客文章Excuses for not installed GNU Parallel。