我有一个远程控制服务器,用于自动对所有串联节点执行命令/脚本等。为了提高性能和速度,我想并行运行它。我正在大约 180 个节点中执行命令。在系列中,我大约需要 2 个小时才能完成所有这些任务。所以我现在正在寻找速度。伪代码如下所示,我使用based64将命令发送到其他节点。我可以使用它执行任何任意复杂的命令。
for host in ${sshconfig[@]}; do
ssh "$host" "echo $COMMAND | base64 -d | bash" &
done
但我犯了一个错误,忘记了有很多节点,所以我的 bash 脚本为每个节点创建了很多进程,结果控制服务器的系统崩溃并关闭了。现在我无法再连接到它了。
我想知道,如何在bash脚本中分配内存? bash的易用性ssh
使得 bash 非常适合我的情况,但我想知道如何通过并行执行它们来提高性能,并且仍然不用担心系统崩溃等。
答案1
要限制并行 SSH 连接的数量,您可以xargs
这样使用:
printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "echo $COMMAND | base64 -d | bash"
这将在最多四个并行实例中运行您的命令(由 给出-P 4
)。该-I {}
选项会将命令中的字符串xargs
替换为从其标准输入读取的字符串。{}
连接到的标准输入仅打印当时列表printf
中的一项。sshconfig
您可以使用各种-P
设置来测试运行它,直到找到一个似乎运行良好的数字。
如果您在远程计算机上的登录 shell 是bash
,您也可以考虑
code=$( base64 -d <<<"$COMMAND" )
printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "$code"