我有一个 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
命令,它等待子进程完成。