在同一台 Linux 服务器上运行多个几乎相同的 Java 进程的最佳方法是什么?
环境说明:
我们正在运行一组提供计算网格的 Java 进程。进程之间的唯一区别是标识节点名称的命令行参数。例如:
(流程1)Java -DNodeNumber=1 CalculationNode
(进程2)Java -DNodeNumber=2 CalculationNode
(进程 3)Java -DNodeNumber=3 CalculationNode
(进程 4)Java -DNodeNumber=4 CalculationNode
启动每个进程的脚本相对简单,但并不简单,因为还有大约 15 个其他参数需要 - 它们对于所有进程都是相同的
如果进程失败,并且 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
Juliano 的解决方案可能适用于简单情况,但并不涵盖所有情况。例如,如果错误处理代码中存在错误,即使发生错误,您的某个进程也可能以退出状态 0 退出。或者它可能会死锁或陷入某种无限循环而无法执行任何有用的操作。
所以如果你想要一个更好的解决方案,可以尝试纳吉奥斯.它允许你编写用于特殊监控任务的插件。
答案3
你可以随时使用守护进程工具监控并重新启动您的进程。