
¿Cuál es la mejor manera de ejecutar múltiples procesos Java casi idénticos en el mismo servidor Linux?
Explicación del entorno:
Estamos ejecutando un conjunto de procesos Java que proporcionan una cuadrícula de cálculo. La única diferencia entre los procesos es el parámetro de la línea de comando que identifica el nombre del nodo. Algo como:
(Proceso 1) Java -DNodeNumber=1 CalculationNode
(Proceso 2) Java -DNodeNumber=2 CalculationNode
(Proceso 3) Java -DNodeNumber=3 CalculationNode
(Proceso 4) Java -DNodeNumber=4 CalculationNode
El script que inicia cada proceso es relativamente simple, pero no trivial, ya que se necesitan alrededor de 15 parámetros más. SON IDÉNTICOS PARA TODOS LOS PROCESOS
Necesito poder reiniciar un proceso si falla con el MISMO parámetro NodeNumber. En otras palabras, si el Nodo 3 falla, necesito reiniciarlo como Nodo 3.
Respuesta1
Yo diría que si un proceso falla, es necesario arreglarlo para que no vuelva a fallar.
Para hacer lo que esperas, algo como esto sería suficiente (no probado, úsalo bajo tu propia responsabilidad):
#!/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
Cada proceso debe finalizar con el código de salida cero para poder romper el ciclo. De lo contrario, el script lo reinicia.
Respuesta2
La solución de Juliano podría funcionar en casos simples, pero no cubre todas las situaciones. Por ejemplo, uno de sus procesos podría salir con el estado de salida 0 aunque haya ocurrido un error, si hay un error en el código de manejo de errores. O podría bloquearse o encontrarse con algún otro tipo de bucle infinito sin hacer nada útil.
Así que si quieres una solución más sofisticada, pruebaNagios. Le permite escribir complementos para tareas de monitoreo especiales.
Respuesta3
Siempre puedes usarDaemon Toolspara monitorear y reiniciar sus procesos.