Я демоннизировал Java-программу, используя библиотеку Commons Daemon/JSVC, и могу успешно запустить/остановить один экземпляр моего сервиса. То, что мне действительно нужно сделать, - это запустить несколько экземпляров моего сервиса, начиная и останавливая каждый с разными аргументами команды.Запуск нескольких экземпляров Java-демона с использованием Commons Daemon/JSVC
Возможно, это не относится к этой проблеме, но небольшой фон. В моем сервисе есть HTTP-прослушиватель, привязанный к определенному порту. Каждый экземпляр будет инициализирован для прослушивания другого порта.
Моя проблема заключается в том, что я не могу запустить более одного экземпляра моего класса Java, используя встроенные функции Commons Daemon. Может быть, я что-то упустил. Я давний разработчик Windows/C#, но относительно новичок в сценариях Java/Linux/Shell.
Скрипт оболочки для запуска процесса JSVC и запуска/остановки моего демона ниже. Это то, что я нашел на этом сайте в другом посте, с несколькими незначительными изменениями. Он проходит через некоторые аргументы команды, которые требует мой демон, и я вызываю этот сценарий sh из отдельных сценариев запуска и остановки, которые задают эти параметры.
#!/bin/sh
# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="/usr/share/java/commons-daemon-z.0.15.jar":"/opt/LuckyElephant/lib/LuckyElephant.jar"
CLASS=co.rightside.luckyelephant.Main
USER=ubuntu
PID=/tmp/luckyelephant.pid
LOG_OUT=/tmp/luckyelephant.out
LOG_ERR=/tmp/luckyelephant.err
ARGS="$*"
do_exec()
{
$EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS $ARGS
}
case "$1" in
start)
do_exec
;;
stop)
do_exec "-stop"
;;
restart)
if [ -f "$PID" ]; then
do_exec "-stop"
do_exec
else
echo "service not running, will do nothing"
exit 1
fi
;;
*)
echo "usage: luckyelephant {start|stop|restart}" >&2
exit 3
;;
esac
Если запуск более одного экземпляра уникального класса Java в не представляется возможным в JSVC, какая альтернатива? Мне нужен безопасный и стабильный способ запуска нескольких экземпляров этой службы (я буду делать это удаленно и программно с помощью SSH), и каждый экземпляр должен быть изящно закрыт при завершении из-за привязки к TCP-порту.
Простите меня, если я еще не знаю очевидного. Запускает ли подчиненная оболочка с символом & при выходе из основной оболочки? Кроме того, как можно было бы изящно завершить фоновый Java-процесс таким образом, чтобы запрос мог быть захвачен в коде и проведена некоторая очистка? – captaintrips
1. Да, процесс завершается при выходе из JVM. 2. Многие серверы (например, tomcat и jetty) прослушивают порт «shutdown» и ждут получения определенных данных (например, строки «SHUTDOWN») для отправки на этом порту, после чего они выполняют весь код очистки и завершают работу. –