Какую выгоду я получу от 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.

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.

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

На этом этапе я бы использовал 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.

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

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

Другие вопросы по тегам