2012-06-29 78 views
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,但我希望做一些更智能的事情並不難。

一些劃痕加工朝着一個解決方案:

第二個嘗試,利用丹尼斯的鏈接的一些想法。近乎理想的香草猛砸解決方案:

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在使用的了。除此之外,我還沒有看到任何問題,並且據我所知,它的工作方式與預期完全一致。

+0

添加一個下來的主機和內部while循環的計數器。服務器關閉> x時,向下取樣主機,直到服務器關閉 JohnP

+0

你如何減少?我只是試了一下,似乎計數器永遠不會減少,也許是因爲它們在不同的進程中運行。 – jonderry

+0

while循環解決方案可以通過讀取子進程寫入的文件描述符來執行,可能嗎? – jonderry

回答

2

xargs具有類似parallel一個並行的特點:

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

..where blocking-restart有望取的名字一臺服務器,請重新啓動並等待它完成。請注意,tr將每臺主機放在一條線上,這是xargs期望的。

1

parallel工具(在Ubuntu/Debian moreutils包中)可能可以在這裏提供幫助;如果你重新寫restart-server工具來阻止,直到服務器備份,你可以在這樣的方式運行腳本:

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

當然,如果四臺服務器不回來了,整個事情停滯不前。也許這是可取的。

+0

感謝您的指針。我感興趣的是如何用一個簡單的Bash腳本來完成這項工作,該腳本仍然只使用基礎知識,因爲這會增加我對Bash/Unix中可實現性的一般理解。 – jonderry