Я хочу запустить процесс 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 & amp;».
Итак, мой первый вопрос: нужно ли мне выполнять nohup или run-in-background с командой exec?
При запуске MyClass запускает другие процессы Java. В инициализации System V остановка службы просто ищет Java-процессы, принадлежащие определенному пользователю, и убивает их. Мой второй вопрос: как я могу контролировать завершение этих процессов с помощью Upstart?
Вы не должны использовать nohup
с тех пор, когда Выскочка запустит программу, тот процесс не будет связан с терминалом (по умолчанию).
Для Выскочки я предложил бы любого просто наличие вызова задания:
exec java -classpath blah MyClass
... или гарантируя, что/path/to/myjavastartscript.sh звонит:
exec java -classpath blah MyClass
Обратите внимание что первое exec
выше Новомодная строка файла конфигурации, тогда как 2-м является ключевое слово оболочки. Если Ваш сценарий оболочки не называет версию оболочки exec
, необходимо будет стараться удостовериться установку Выскочки expect
строка файла конфигурации правильно - видит http://upstart.ubuntu.com/cookbook/#expect.
Относительно остановки сервиса Выскочка автоматически уничтожит процесс, который это отслеживает (основной процесс JVM, связанный с MyClass
) и любые дети того процесса (технически любой процесс в той же группе процесса (см. http://upstart.ubuntu.com/cookbook/#stopping-a-job)).
Без большего количества деталей я не уверен Ваш start on
условие подходит - по-видимому, Вы хотите задание MyClass, запускаются, если и только если конфигурационный файл был установкой? Если так, стандартная идиома для заданий pre-start
строка файла конфигурации для чтения в /etc/default/MyClass.conf
. Если это решает, что или файл не существует, или файл конфигурации так или иначе указывает, что сервис отключен / не, устанавливают правильно, pre-start
может просто звонить stop
остановить задание от (полностью) стартового (см. http://upstart.ubuntu.com/cookbook/#pre-start). Преимущество этого подхода, являющегося, что Ваш start on
условие может затем быть надежно установлено к любому набору условий, должен заставить задание запускаться. Когда те условия будут соблюдать, Выскочка выполнит задание; предварительный запуск выполнит, решит, что конфигурация еще не действительна, и просто выйдите. День администратор действительно решает настроить сервис, задание, полностью запустится.
См. http://upstart.ubuntu.com/cookbook/#determining-the-start-on-condition-ubuntu-specific и http://upstart.ubuntu.com/cookbook/#ubuntu-well-known-events-ubuntu-specific для определения start on
состояние.
Обратите внимание наконец, что необходимо действительно всегда указывать a stop on
условие также. См. http://upstart.ubuntu.com/cookbook/#stop-on.
У меня была та же проблема: я хотел запустить сервер 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