Как лучше всего запустить несколько почти идентичных процессов Java на одном сервере Linux?
Объяснение окружения:
Мы запускаем набор процессов 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.
Я бы сказал, что если процесс не работает, вам нужно исправить это, чтобы больше не сбой.
Чтобы сделать то, что вы ожидаете, будет достаточно чего-то вроде этого (не проверено, используйте на свой страх и риск):
#!/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
Каждый процесс должен завершиться с нулевым кодом выхода, чтобы разорвать цикл. В противном случае он перезапускается скриптом.
Вы всегда можете использовать DAEMON Tools для мониторинга и перезапуска ваших процессов.
Решение Джулиано может работать в простых случаях, но оно не охватывает все ситуации. Например, один из ваших процессов может завершиться со статусом выхода 0, даже если произошла ошибка, если есть ошибка в коде обработки ошибок. Или он может зайти в тупик или попасть в какой-то другой бесконечный цикл, не сделав ничего полезного.
Поэтому, если вам нужно более интересное решение, попробуйте Nagios. Он позволяет писать плагины для специальных задач мониторинга.