Запуск процессов Java с помощью Upstart
Я хочу запустить процесс Java с помощью Upstart. В настоящее время на наших серверах OpenSuSE я использую систему инициализации System V, но на наших серверах Ubuntu я бы предпочел использовать Upstart. Но у меня есть два вопроса...
У меня есть задание Upstart (задача) для настройки сервера, которое называется, скажем, myconfig. И в работе, которая запускает мои процессы Java, якобы имею:
start on stopped myconfig
exec /path/to/myjavastartscript.sh
myjavastartscript.sh запускает "java -classpath blah MyClass". В инициализации System V при запуске службы выполняется "nohup /path/to/myjavastartscript.sh &".
Итак, мой первый вопрос: нужно ли мне выполнять nohup или run-in-background с командой exec?
При запуске MyClass запускает другие процессы Java. В инициализации System V остановка службы просто ищет Java-процессы, принадлежащие определенному пользователю, и убивает их. Мой второй вопрос: как я могу контролировать завершение этих процессов с помощью Upstart?
2 ответа
Вам не нужно использовать nohup поскольку, когда Upstart запускает программу, этот процесс не будет связан с терминалом (по умолчанию).
Для Upstart я бы предложил либо просто позвонить по работе:
exec java -classpath blah MyClass
... или убедиться, что /path/to/myjavastartscript.sh вызывает:
exec java -classpath blah MyClass
Обратите внимание, что первый exec выше раздел Upstart, тогда как 2-й является ключевым словом оболочки. Если ваш сценарий оболочки не вызывает версию оболочки exec, вы должны быть осторожны, чтобы убедиться, что вы установите Upstart expect раздел правильно - см. http://upstart.ubuntu.com/cookbook/.
Что касается остановки службы, Upstart автоматически убивает отслеживаемый процесс (основной процесс JVM, связанный с MyClass) и любые дочерние элементы этого процесса (технически любой процесс в той же группе процессов (см. http://upstart.ubuntu.com/cookbook/)).
Без более подробной информации, я не уверен, что ваш start on условие подходит - возможно, вы хотите, чтобы задание MyClass запускалось тогда и только тогда, когда был настроен файл конфигурации? Если это так, стандартная идиома для рабочих мест pre-start строфа для чтения в /etc/default/MyClass.conf, Если он решает, что либо файл не существует, либо файл конфигурации каким-то образом указывает на то, что служба отключена / настроена неправильно, pre-start можно просто позвонить stop чтобы остановить (полностью) запуск задания (см. http://upstart.ubuntu.com/cookbook/). Преимущество этого подхода в том, что ваш start on После этого условие может быть надежно установлено на любой набор условий, который должен привести к запуску задания. Когда эти условия будут выполнены, Upstart запустит задание; Предварительный запуск запустится, определите, что конфигурация еще не действительна, и просто выйдите. В день, когда администратор решит настроить службу, задание будет полностью запущено.
См. Http://upstart.ubuntu.com/cookbook/#determining-the-start-on-condition-ubuntu-specific и http://upstart.ubuntu.com/cookbook/ для определения start on состояние.
Наконец, обратите внимание, что вы всегда должны указывать stop on состояние тоже. См. http://upstart.ubuntu.com/cookbook/.
У меня была та же проблема: я хотел запустить сервер serviio dlna при загрузке моей машины.
Это мое /etc/init/serviio.conf:
description "Start serviio DLNA server"
author "aanno"
start on net-device-up IFACE=eth0
stop on runlevel [!2345]
env enabled=1
setuid tpasch
setgid tpasch
#respawn the process if it crashes
respawn
env SERVIIO_HOME=/home/tpasch/serviio-1.0.1
script
[ "$enabled" = "1" ] || [ "$force_start" = "1" ] || exit 0
# Setup Serviio specific properties
JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dderby.system.home=$SERVIIO_HOME/library -Dserviio.home=$SERVIIO_HOME -Xmx512M -Xms20M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20"
# construct classpath
cd $SERVIIO_HOME
CLASSPATH="config"
for i in lib/*.jar; do
CLASSPATH="$CLASSPATH:$i"
done
exec /usr/bin/java $JAVA_OPTS -classpath $CLASSPATH org.serviio.MediaServer
end script