重启一堆服务器,在重启期间只保留少量服务器

时间:2012-06-29 02:24:24

标签: bash

考虑以下脚本:

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的命名队列已经在使用中。除此之外,我还没有看到任何问题,而且就我所知,它的工作方式完全符合预期。

2 个答案:

答案 0 :(得分:2)

xargs具有与parallel类似的并行功能:

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

..其中blocking-restart应该取一个服务器的名称,重新启动它并等到它完成。请注意,tr将每个主机放在自己的行上,这就是xargs所期望的。

答案 1 :(得分:1)

parallel工具(在Ubuntu / Debian moreutils包中)可以在这里提供帮助;如果你重新编写restart-server工具来阻止,直到服务器恢复,你可以用这样的方式运行脚本:

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

当然,如果四台服务器没有重新启动,整个事情就会停止。也许这是可取的。