Какую выгоду я получу от JSVC от простого использования systemd?
Документация Tomcat описывает процесс компиляции и установки JSVC, который можно использовать для запуска Tomcat в качестве демона. Насколько я понимаю, у 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.
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.
Имейте в виду, что JSvc - просто еще один исполняемый файл. Так, например, обычный системный пользователь может настроить службу JSvc. Можно с уверенностью сказать, что в большинстве дистрибутивов Systemd требует настройки привилегий root.
Я также написал программы на Java, которые используют JSvc и ProcRun.exe, обернув небольшой интерфейс Java. Это позволяет мне использовать один и тот же сервисный код и даже интеграционные тесты JUnit в ОС Unix и Windows. Поэтому я бы поспорил, что JSvc и ProcRun.exe вместе облегчают кроссплатформенный сервисный код.
В JSvc есть несколько интересных специфических для Java опций, которые могут быть вам полезны. Например, как запустить JVM (процесс или DLL) и т. Д. Многие из них можно написать в сценарии Systemd, но я подозреваю, что в этот момент вы просто переписываете JSvc в Bash.
Так что, возможно, это не очень убедительно для вашего конкретного примера Tomcat. Но есть несколько преимуществ использования крошечной оболочки службы JSvc по сравнению с Systemd.
Вам следует использовать jsvc, если вы хотите запустить tomcat с привилегиями не-root, но с низким портом (<1024).
Также отключение порта отключения становится доступным. Однако его нельзя использовать при запуске Tomcat со стандартными сценариями оболочки, поскольку это предотвратит корректную остановку shutdown.bat|.sh и catalina.bat|.sh.