Запустите процесс Java при начальной загрузке и авторестарте на смерти

У меня есть два требования для моего приложения Java. Если это умирает, перезапустите его. Если перезагрузки сервера, перезапустите его - достаточно простой. Используя ответ здесь у меня есть сценарий, который перезапустит, когда JAVA-приложение умрет.

#!/bin/bash

until java -Xms256m -Xmx768m -jar MyApp.jar; do
    echo "MyApp crashed with exit code $?.  Respawning... " >&2
    sleep 5
done

Я могу выполнить это с "nohup restart_script.sh и", и это будет целый день работать без проблемы. Теперь для требования по запуску. Я взял/etc/init.d/crond сценарий и заменил crond двоичный файл моим сценарием, но он зависает на запуске.

#!/bin/bash
#
# Init file for my application.
#
. /etc/init.d/functions

MYAPP=restart_script.sh
PID_FILE=/var/run/myapp.pid

start(){
        echo -n "Starting My App"
        daemon --user appuser $MYAPP
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/myapp
        return $RETVAL
}

stop(){
        echo -n "Stopping my application"
        killproc $MYAPP
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/myapp
        return $RETVAL
}

...

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
...
esac

Когда я работаю,/sbin/service myapp запускаются, сценарий запускает, но подвешивает консоль. Я судил "демона - пользователь appuser nohup $MYAPP и", и я сразу возвращаюсь к подсказке без любого [OK] признак и когда я делаю PS, я все еще вижу, что init подвешивается. Какие-либо идеи, как назвать сценарий в рамках init сценария и заставить его возвращаться правильно?

Спасибо,

Greg

6
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Функция демона на моей машине (старый RedHat) не возвращается, пока не вернется выполненная программа. Итак, вам нужно, чтобы ваш небольшой служебный скрипт выполнял разветвление.

Попробуйте написать свою утилиту следующим образом:

#!/bin/bash

(
    until java -Xms256m -Xmx768m -jar MyApp.jar; do
        echo "MyApp crashed with exit code $?.  Respawning... " >&2
        sleep 5
    done
) &

Как это работает. Помещение команды в круглые скобки запускает код, выполняемый в новом процессе. Вы помещаете процесс в фоновый режим, чтобы исходный процесс вернулся, не дожидаясь его.

9
ответ дан 8 December 2019 в 18:36
поделиться

Вам нужна обертка от java, вот очень хорошая... tanuki
Я хочу сказать, что вам не нужно изобретать колесо заново, там есть инструменты...

4
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: