在远程 ssh 会话中在 & 符号之后运行命令

在远程 ssh 会话中在 & 符号之后运行命令

我有一个 shell 脚本,它在几台不同的机器上启动一个长的、资源密集型的命令。

为了在每台机器上并行执行脚本,我在 for 循环中的每个远程命令后面都有一个 & 符号。

initialize-cluster.sh:

while read host; 
do
    ssh -f "$host" \"/home/user/allocate.sh\" &
done < ~/cluster

然而,结果是,我在 for 循环结束时没有得到 shell 提示符。这会阻止我在所有计算机上initialize-cluster.sh完成运行后执行其他脚本。allocate.sh

例如,我希望能够运行如下命令:

./initalize-cluster.sh && ./execute-something-else.sh

然而,目前initialize-cluster还没有“完成”。

allocate.sh我希望仅在远程计算机上的所有脚本完成后才执行后续命令。

答案1

此脚本中的任何内容都不应阻止执行下一个命令或返回到 shell 提示符。给人留下提示消失的印象的是远程脚本的输出,该输出将在返回 shell 后到达。为了避免这种情况,您可以将 stdout/stderr 重定向到某个日志文件。

由于远程命令在后台运行,原始脚本将完成脚本allocate已完成执行:下一个命令不能假设初始化已完成。为了并行启动所有初始化并等待它们全部完成,您可以执行以下操作:

#!/bin/sh
while read host 
do
  ssh "$host" "/home/user/allocate.sh" &
done < ~/cluster
wait

然后应该可以:

./initialize-cluster.sh && ./execute-something-else.sh

这里的关键是wait命令,它等待子进程完成。

相关内容