2

考虑以下脚本:

for host in $(get-all-hosts)
do
  (restart-server $host; wait-for-server-to-come-up $host) &
done

正如您可能猜到的那样,restart-server重新启动服务器并wait-for-server-to-come-up阻止命令直到服务器启动(例如,grep -m 1 'server up' <(tail -f /path/to/log))。

该脚本基本上同时重新启动所有服务器。我很好奇修改此脚本以在某些固定数量的服务器后停止并等待一台服务器启动后再继续下一次重新启动的最简单方法是什么,以便在任何给定的情况下最多有 4 台服务器停机时间。我知道这样做的一种方法是简单地以 4 个块重新启动并等待每个块中的所有 pid,但我希望做一些更聪明的事情并不难。

一些从头开始的解决方案:

第二次尝试,使用丹尼斯链接中的一些想法。几乎是香草 Bash 解决方案的理想选择:

mkfifo mfifo
exec 3<>mfifo
echo >&3
echo >&3
echo >&3
for host in $(get-all-hosts)
do
  read
  (restart-server $host; wait-for-server-to-come-up $host; echo >&3) &
done <&3

我对这个解决方案最大的抱怨是它假设还没有一个名为 mfifo 的命名队列已经在使用中。除此之外,我没有看到任何问题,据我所知,它完全按照预期工作。

4

2 回答 2

2

xargs具有类似于以下的并行特性parallel

echo $(get-all-hosts) | tr ' ' '\n' | xargs -P 4 -n 1 ./blocking-restart

..whereblocking-restart预计将采用单个服务器的名称,重新启动它并等待它完成。请注意tr将每个主机放在自己的行上,这是 xargs 所期望的。

于 2012-06-29T04:05:28.100 回答
1

parallel工具(在 Ubuntu / Debianmoreutils软件包中)可能会在这里提供帮助;如果您重新编写restart-server工具以阻止直到服务器恢复,您可以以如下方式运行脚本:

parallel -j 4 restart-server -- $(get-all-hosts)

当然,如果四台服务器都没有恢复,整个事情就会陷入停顿。也许这是可取的。

于 2012-06-29T02:34:36.783 回答