
Каков наилучший способ запустить несколько почти идентичных процессов Java на одном сервере Linux?
Объяснение окружающей среды:
Мы запускаем набор процессов Java, которые предоставляют сетку вычислений. Единственное различие между процессами — параметр командной строки, который определяет имя узла. Что-то вроде:
(Процесс 1) Java -DNodeNumber=1 УзелВычисления
(Процесс 2) Java -DNodeNumber=2 УзелВычисления
(Процесс 3) Java -DNodeNumber=3 УзелВычисления
(Процесс 4) Java -DNodeNumber=4 УзелВычисления
Скрипт, который запускает каждый процесс, относительно прост, но не тривиален, поскольку требуется около 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
Решение Джулиано может работать в простых случаях, но оно не охватывает все ситуации. Например, один из ваших процессов может завершиться с кодом завершения 0, даже если произошла ошибка, если в коде обработки ошибок есть ошибка. Или он может заблокироваться или попасть в какой-то другой бесконечный цикл, не сделав ничего полезного.
Так что если вам нужно более необычное решение, попробуйтеНагиос. Позволяет писать плагины для специальных задач мониторинга.
решение3
Вы всегда можете использоватьDAEMON Toolsдля мониторинга и перезапуска ваших процессов.