gpt4 book ai didi

linux - BASH:无需等待即可同时执行多循环功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:32 32 4
gpt4 key购买 nike

用例:

需要将二进制文件 (1Gb) 传输到 IP 数组并在到达目的地后开始执行它们,而无需等待所有二进制文件传输/执行。某种并行模式。

情况:

我有 2 个函数 - 传输和执行(根据方法,它可以缩短为 1 个,有 2 个循环)。

for N in "${NODES[@]}"; do
rsync -Pcz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --timeout=10 $FILE user@$N
done

for N in "${NODES[@]}"; do
ssh user@$N "cd ~/; ./exec.sh"
done

关键是在这种情况下我必须等到所有传输都先完成(有时可能有几十个地址)然后才开始执行。

如果我将循环组合成一个循环,我必须再次等待 - 这次是每个节点的传输+执行。

期望:

我想将文件传输到第一个节点,开始执行,然后切换到具有相同进程的第二个节点,依此类推。因此,时间只计算传输,而每个节点并行执行自己的文件。

障碍:

1-需要能够从每个节点得到一个执行输出

2- 附加包,如screen 不是一个选项。

我尝试了什么:

我正在考虑通过循环将一些脚本注入(inject)远程节点以控制从那里执行。但我确信一定有一些不那么野蛮的选择。

这里可以做什么?

最佳答案

您应该能够使用单个循环,并运行带有 & 后缀的 ssh 命令,该命令在后台运行(即无需等待它finish),然后在循环之后使用 wait 等待所有这些完成。收集输出会更有趣...我认为您需要将每次运行的输出收集到一个文件中,然后在最后打印文件。像这样的东西(请注意,我没有正确测试过):

tmpdir="$(mktemp -qd -t "$(basename "$0")")" || {
echo "Error creating temporary directory" >&2
exit 1
}

for nodenum in "${!NODES[@]}"; do
# The ${!array[@]} idiom gets a list of array *indexes*, not elements; get the element by index:
N=${NODES[nodenum]}
# Copy file, and wait for copy to finish:
rsync -Pcz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --timeout=10 $FILE user@$N
# Start the script, and *don't* wait for it to finish:
ssh user@$N "cd ~/ sh exec.sh" >"$tmpdir/$nodenum.out" 2>&1 &
done

# Wait for all of the scripts to finish
wait

# Print all of the outputs (in order)
for nodenum in "${!NODES[@]}"; do
echo
echo "Output from ${NODES[nodenum]}:"
cat "$tmpdir/$nodenum.out"
done

# Clean up the temp directory
rm -R "$tmpdir"

顺便说一句,远程命令 "cd ~/sh exec.sh" 没有意义。那里应该有分号吗?此外,我建议使用小写或混合大小写的变量名称以避免与许多具有某种特殊含义的全大写变量发生冲突,并在变量引用周围加上双引号(即 rsync ... "$FILE ""user@$N" 而不是 rsync ... $FILE user@$N).

编辑:假设您希望在特定副本完成后立即在每个主机上启动脚本;如果您想等到所有 副本完成,然后立即触发所有脚本,使用两个循环:一个执行副本,然后第二个执行ssh 命令在后台(如上所述收集输出),然后等待所有这些完成,然后打印所有输出。

关于linux - BASH:无需等待即可同时执行多循环功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625126/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com