Bash系统的并行进程已经关闭了吗?

Bash系统的并行进程已经关闭了吗?

我有一个远程控制服务器,用于自动对所有串联节点执行命令/脚本等。为了提高性能和速度,我想并行运行它。我正在大约 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"

相关内容