
在同一台 Linux 伺服器上運行多個幾乎相同的 Java 進程的最佳方法是什麼?
環境說明:
我們正在運行一組提供計算網格的 Java 進程。進程之間的唯一區別是標識節點名稱的命令列參數。就像是:
(流程1)Java -DNodeNumber=1 CalculationNode
(流程2)Java -DNodeNumber=2 CalculationNode
(流程3)Java -DNodeNumber=3 CalculationNode
(流程4)Java -DNodeNumber=4 CalculationNode
啟動每個進程的腳本相對簡單,但並不簡單,因為還需要大約 15 個其他參數 - 它們對於所有進程都是相同的
如果進程因 SAME NodeNumber 參數而失敗,我需要能夠重新啟動該進程。換句話說 - 如果節點 3 發生故障,我需要將其重新啟動為節點 3。
答案1
我認為,如果一個流程失敗,您需要修復它以便不再失敗。
為了達到您的期望,類似這樣的事情就足夠了(未經測試,使用風險自負):
#!/bin/bash
for i in $(seq 1 4)
do
(
echo "Starting node $i..."
while ! java -DNodeNumber=$i CalculationNode
do
sleep 1
echo "Restarting node $i..."
done
) &
done
wait
每個進程必須以退出程式碼零結束才能打破循環。否則,將由腳本重新啟動。
答案2
朱利亞諾的解決方案可能適用於簡單的情況,但它並不能涵蓋所有情況。例如,如果錯誤處理程式碼中有錯誤,即使發生錯誤,您的進程之一也可能以退出狀態 0 退出。或者它可能會死鎖或陷入某種其他類型的無限循環而不做任何有用的事情。
因此,如果您想要更高級的解決方案,請嘗試納吉奧斯。它允許您為特殊監控任務編寫插件。
答案3
你總是可以使用守護程式工具監視並重新啟動您的進程。