Какие преимущества я получаю от JSVC по сравнению с использованием только systemd?

Документация Tomcat описывает процесс компиляции и установки JSVC, который можно использовать для запуска Tomcat в качестве демона. Насколько я понимаю, у JSVC есть два преимущества:

  1. Он запускается как root, что позволяет использовать привилегированный порт (например, 80 или 443).
  2. Он создает «процесс контроллера», который будет отслеживать «контролируемый процесс» (основной поток Java) и перезапускать процесс в случае сбоя.

Я изучал systemd, включая конфигурация сервисного модуля. Основываясь на моем ограниченном понимании, systemd может выполнять те же задачи, что и JSVC, если я установил User=tomcat (используя нужное имя пользователя) и Restart=on-failure в моем файле конфигурации tomcat.service.

Используя JSVC, я ожидаю, что tomcat.service будет выглядеть примерно так:

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Environment=CATALINA_PID=/var/run/tomcat.pid
Environment=JAVA_HOME=/path/to/java
Environment=CATALINA_HOME=/opt/tomcat
...

ExecStart=/opt/tomcat/bin/jsvc \
    -Dcatalina.home=${CATALINA_HOME} \
    -user tomcat \
    -java-home ${JAVA_HOME} \
    -pidfile ${CATALINA_PID} \
    ...
    org.apache.catalina.startup.Bootstrap

ExecStop=/opt/tomcat/bin/jsvc \
    -pidfile ${CATALINA_PID} \
    ...
    -stop \
    org.apache.catalina.startup.Bootstrap

[Install]
WantedBy=multi-user.target

Используя systemd, я ожидаю, что tomcat.service будет выглядеть примерно так:

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking  
PIDFile=/var/run/tomcat.pid
User=tomcat
Group=tomcat
Environment=JAVA_HOME=/path/to/java
Environment=CATALINA_HOME=/opt/tomcat
...

Restart=on-failure

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

Я предпочитаю использовать только systemd, так как он уже есть, и я должен (должен) использовать его в любом случае. Однако я не уверен в том, упущу ли я какое-либо преимущество использования JSVC, которое я упускаю из виду.

Что можно сделать с помощью JSVC, чего нельзя сделать с помощью systemd, если я хочу запустить Tomcat в качестве демона?

Кроме того, если systemd может выполнять те же задачи, что и JSVC, а также JSVC, я также хотел бы попросить вас дать какие-либо советы по настройке, чтобы наилучшим образом реализовать преимущества JSVC, используя только systemd.


person Community    schedule 06.03.2015    source источник
comment
Обратите внимание, что многие системные администраторы до сих пор избегают перехода на systemd по ряду причин, и я полагаю, что JSVC также будет работать с традиционными системами инициализации.   -  person chrylis -cautiouslyoptimistic-    schedule 09.03.2015
comment
не должно быть, After=remote-fs.target nss-lookup.target ?   -  person J. M. Becker    schedule 23.06.2016


Ответы (3)


В общем, большая часть функций, предоставляемых jsvc, предоставляется systemd, за исключением открытия привилегированных портов (см. ниже). Если возможно, было бы очень хорошей идеей переключиться на прямое использование функциональности systemd, так как все становится проще и эффективнее.

Ваш файл модуля выглядит в основном нормально, за исключением

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

Эта часть выглядит как еще одна обертка, которую можно заменить прямой на java -jar ....

Открытие привилегированных сокетов

В Systemd это обычно делается через активацию сокета. Systemd открывает сокет и передает его демону как дескриптор открытого файла (например, stdin, stdout, stderr).

Затем демон может быть запущен как непривилегированный пользователь и сам не теряет привилегии. Демон должен поддерживать это, и вместо того, чтобы открывать сокет сам, он должен использовать тот, который ему дали. В Java это становится очень проблематичным из-за отсутствия поддержки в Java stdlib.

Насколько я знаю, tomcat не поддерживает активацию сокетов, поэтому, если вы хотите использовать привилегированный порт и запускать демон под непривилегированным пользователем, jsvc все равно может понадобиться.

person zbyszek    schedule 08.03.2015
comment
Я бы не стал использовать сценарий startup.sh, но обязательно запускал командную строку java напрямую. Это приводит к меньшему количеству процессов, и systemd может напрямую отслеживать процесс JVM (для возрождения). - person eckes; 09.03.2015
comment
Я знаю, что опаздываю на вечеринку, но я нашел это статья действительно полезная. Автор явно разбирается в systemd. - person Mark Gibson; 19.03.2016
comment
В итоге я использовал catalalina.sh run, который будет работать в текущих окнах и по-прежнему выполняет все настройки, необходимые для запуска jar. - person oers; 25.01.2018
comment
@MarkGibson: я думаю, что статья переехала, я нашел ее здесь - person huch; 12.06.2018
comment
@huch, он продолжает двигаться. Для всех, кто заинтересован, просто найдите systemd house of Horror Tomcat. Довольно сенсационное. - person Willa; 02.06.2021

На данный момент я бы использовал JSvc. Но если нужно, оберните его скриптом Systemd.

  1. Имейте в виду, что JSvc — это просто еще один исполняемый файл. Таким образом, обычный пользователь системы может, например, настроить службу JSvc. Можно с уверенностью сказать, что в большинстве дистрибутивов Systemd требует настройки привилегий root.

  2. Я также написал Java-программы, использующие JSvc и ProcRun.exe, обернув небольшой Java-интерфейс. Это позволяет мне использовать один и тот же сервисный код и даже интеграционные тесты JUnit в операционных системах Unix и Windows. Так что я бы сказал, что JSvc и ProcRun.exe вместе облегчают межплатформенный сервисный код.

  3. В JSvc есть несколько интересных опций, специфичных для Java, которые могут быть вам полезны. Например, как запустить JVM (процесс или DLL) и т. д. Многие из них можно написать в сценарии Systemd, но я подозреваю, что в этот момент вы просто перепишете JSvc в Bash.

Так что, возможно, это не очень убедительно для вашего конкретного примера Tomcat. Но есть некоторые преимущества использования крошечной сервисной оболочки JSvc по сравнению с Systemd.

person kervin    schedule 14.03.2015
comment
Спасибо за ваши идеи. Они очень полезны. - person ; 14.03.2015
comment
При включении jsvc в сценарий systemd следует ли использовать Type=forking ? - person EricS; 06.11.2018

Вам следует использовать jsvc, если вы хотите запустить tomcat с привилегиями без полномочий root, но используя низкий порт (‹1024).

Также становится доступным отключение порта выключения. Однако его нельзя использовать при запуске Tomcat со стандартными сценариями оболочки, поскольку он не позволит файлам shutdown.bat|.sh и catalina.bat|.sh корректно остановить его.

person user3132194    schedule 14.01.2016