如何编写Unix脚本以在多个远程服务器上快速启动服务?

时间:2011-11-24 15:29:19

标签: bash unix scripting

我正在尝试在多个(~20个)Unix服务器上运行应用程序。我想登录一个并使用脚本启动它们,而不是单独通过SSH进入每一个。

应用程序不需要任何直接的用户交互,所以我基本上只需要在每台机器上运行'./app arg1 arg2'。

3 个答案:

答案 0 :(得分:3)

直接SSH的一个改进是在后台启动SSH会话,然后wait完成所有这些。这样您就可以同时在远程服务器上执行命令。

我们在生产脚本中使用这种技术。

function start_server ( )
{
  ssh $1 '/path/to/start_service_script'
}

echo "Starting servers"
for serv_name in $( cat /path/to/server-list )
do
    # I usually declare a function, because if SSH command
    # gets more elaborate ( especially if it has ampersands
    # as part of the command, the shell has trouble parsing 
    # the background push (& at the end of the command)
    #
    # In this particular case it would be no trouble to
    # inline ssh here
    start_server ${serv_name} &
done

echo
# Very important to wait till all the spawned processes finish
wait

有一点需要注意,因为所有衍生进程同时运行并使用相同的控制台,您可能会在屏幕上看到一些交错输出。

答案 1 :(得分:2)

您必须使用ssh,如果在服务器上设置了正确的公钥,则无需输入密码:

for host in hosts
do
   ssh user@$host "./app arg1 arg2"
done

否则,您可以使用Fabric来帮助您以编程方式执行此操作。

答案 2 :(得分:0)

omnissh() { for s in $(cat /server/list) ; do ssh $s "$@" ; done }

omnissh /etc/init.d/service start