Запустите Java-процесс при загрузке и автоматический перезапуск при смерти - PullRequest
5 голосов
/ 05 февраля 2010

У меня есть два требования для моего приложения 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 start, скрипт запускается, но консоль зависает. Я попробовал "daemon --user appuser nohup $ MYAPP &", и я сразу же вернулся к приглашению без указания [OK], и когда я делаю ps, я все еще вижу, что init завис. Любые идеи, как вызвать сценарий в сценарии инициализации и заставить его вернуться правильно?

Спасибо

Грег

Ответы [ 2 ]

8 голосов
/ 05 февраля 2010

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

Попробуйте написать свою утилиту так:

#!/bin/bash

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

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

4 голосов
/ 05 февраля 2010

Вам нужен упаковщик Java-сервисов, вот очень хороший ... tanuki
Я имею в виду, вам не нужно изобретать велосипед, там есть инструменты ..

...