我想在多臺(〜20臺)Unix服務器上運行一個應用程序。我不想單獨使用SSH,而是想登錄到其中一個,並使用腳本將其全部啓動。如何編寫一個Unix腳本以在多個遠程服務器上快速啓動服務?
該應用程序不需要任何直接的用戶交互,所以我基本上只需要在每臺機器上運行'./app arg1 arg2'。
我想在多臺(〜20臺)Unix服務器上運行一個應用程序。我不想單獨使用SSH,而是想登錄到其中一個,並使用腳本將其全部啓動。如何編寫一個Unix腳本以在多個遠程服務器上快速啓動服務?
該應用程序不需要任何直接的用戶交互,所以我基本上只需要在每臺機器上運行'./app arg1 arg2'。
直接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
有一點需要注意,因爲所有的子進程同時運行,並使用相同的控制檯,您可以在屏幕上看到一些交錯輸出。
omnissh() { for s in $(cat /server/list) ; do ssh $s "[email protected]" ; done }
omnissh /etc/init.d/service start
你將不得不使用ssh,如果設置正確的公共密鑰到你的服務器,你就不必輸入密碼:
for host in hosts
do
ssh [email protected]$host "./app arg1 arg2"
done
否則,你可以使用Fabric幫助你以編程方式做到這一點。
如果您使用斐波納契樹而不是星形拓撲,則可以減少主要主機上的負載,並且還可以加快完成廣播傳播的時間。儘管如此,+1爲'&'主意:) – bitmask
@bitmask。對於大約20臺服務器(與OP請求一樣),我沒有看到中央服務器的負載問題。 –