Запустите несколько экземпляров 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.
3 ответа
Предполагая, что необходимо развернуть n экземпляров этого демона, скажем, 3 (jDaemon_A, jDaemon_B & jDaemon_C). Я хотел бы подойти к проблеме, используя один из следующих 3 вариантов:
Вариант A: Служба развернута 3 раза каждый, используя отдельный каталог данных. И используйте соглашение об именах, чтобы различать каждый, например,
jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;
так что вы можете начать каждый отдельный
service jDaemon_A start
etc…
Вариант B: Реализуйте вышеупомянутое, плюс еще один Java-класс, который будет управлять любым количеством экземпляров в зависимости от того, что вам нравится, так что вы можете передавать аргументы:
service jDaemon_Manager start all
service jDaemon_Manager start B
Предоставление возможности запуска всего или только одного конкретного экземпляра.
Вариант C: многопоточность. Рассматривали ли вы, что текущий демон работает только с 1 экземпляром в многопоточном режиме, так что одна и та же логика запускается одновременно в разных потоках? Таким образом, у вас будет работать только один демон.
Это может быть жизнеспособным решением, поскольку потоки могут работать относительно независимо.
Конечно, это может быть неприменимо в вашем случае, но я подумал, что этот маршрут стоит рассмотреть.
Мне удалось запустить несколько экземпляров демона, используя разные pid-файлы для каждого экземпляра. А также различные файлы log_out и log_err для облегчения отслеживания.
Вы можете просто запустить программу Java с &
в конце, чтобы он работал в фоновом режиме.