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

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

  • Он запускается как root, что позволяет использовать привилегированный порт (например, 80 или 443).
  • Он создает "процесс контроллера", который будет контролировать "контролируемый процесс" (основной поток 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.

Ответы

Ответ 1

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

Файл вашего устройства выглядит в основном ОК, за исключением

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

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

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

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

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

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

Ответ 2

В этот момент я буду использовать JSvc. Но оберните его с помощью Systemd script, если придется.

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

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

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

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

Ответ 3

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

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