Die Tomcat-Dokumentation beschreibt den Prozess des Kompilierens und Installierens von JSVC , der zum Ausführen von Tomcat als Daemon verwendet werden kann. Nach meinem Verständnis hat JSVC zwei Vorteile:
Ich habe systemd gelernt, einschließlich der Diensteinheitskonfiguration . Aufgrund meines begrenzten Verständnisses kann systemd dieselben Aufgaben wie JSVC ausführen, wenn ich User=Tomcat
(mit dem gewünschten Benutzernamen) und Restart=on-failure
in meiner Tomcat.service
-Konfigurationsdatei einstellt.
Bei Verwendung von JSVC würde ich erwarten, dass Tomcat.service
in etwa wie folgt aussieht:
[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
Bei Verwendung von systemd würde ich erwarten, dass Tomcat.service
in etwa so aussieht:
[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
Meine Präferenz ist es, nur systemd zu verwenden, da es bereits vorhanden ist und ich es trotzdem verwenden muss (soll). Ich bin mir jedoch nicht sicher, ob ich irgendeinen Nutzen bei der Verwendung von JSVC vermisse, den ich übersehen habe.
Was kann mit JSVC erreicht werden, was von systemd nicht erreicht werden kann, wenn ich Tomcat als Dämon ausführen möchte?
Wenn systemd in der Lage ist, dieselben Aufgaben wie JSVC und JSVC auszuführen, würde ich auch gerne nach Konfigurations-Tipps fragen, die Sie möglicherweise anbieten, um die Vorteile von JSVC am besten mit systemd zu erreichen.
Im Allgemeinen wird der größte Teil der von jsvc bereitgestellten Funktionen von systemd bereitgestellt, mit der Ausnahme, dass privilegierte Ports geöffnet werden (siehe unten). Wenn möglich, ist es eine sehr gute Idee, direkt zur Verwendung der systemd-Funktionalität zu wechseln, da dies einfacher und effizienter wird.
Ihre Gerätedatei sieht meistens in Ordnung aus, mit Ausnahme von
ExecStart=/opt/Tomcat/bin/startup.sh
ExecStop=/opt/Tomcat/bin/shutdown.sh
Dieser Teil sieht aus wie ein anderer Wrapper, der durch eine direkte Verknüpfung von Java -jar ...
ersetzt werden kann.
Unter Systemd erfolgt dies normalerweise durch Socketaktivierung. Systemd öffnet den Socket und übergibt ihn dem Daemon als einen offenen Dateideskriptor (wie stdin, stdout, stderr).
Der Daemon kann dann als unprivilegierter Benutzer gestartet werden und lässt die Berechtigungen selbst nicht fallen. Der Daemon muss dies unterstützen, und anstatt den Socket selbst zu öffnen, sollte er den angegebenen verwenden. Unter Java wird dies durch die fehlende Unterstützung in der Java-Stdlib sehr problematisch.
AFAIK, Tomcat unterstützt keine Socket-Aktivierung. Wenn Sie also einen privilegierten Port verwenden und den Dämon unter einem nicht privilegierten Benutzer ausführen möchten, ist möglicherweise noch jsvc erforderlich.
An diesem Punkt würde ich JSvc verwenden. Umhüllen Sie es jedoch mit einem Systemd-Skript, wenn ich müsste.
Denken Sie daran, dass JSvc nur eine weitere ausführbare Datei ist. So kann ein normaler Systembenutzer beispielsweise einen JSvc-Dienst konfigurieren. Man kann mit Sicherheit sagen, dass in den meisten Distros Systemd Root-Berechtigungen konfiguriert werden müssen.
Ich habe auch Java-Programme geschrieben, die JSvc und ProcRun.exe verwenden, indem eine kleine Java-Schnittstelle eingebunden wird. Dadurch kann ich denselben Servicecode und sogar JUnit-Integrationstests unter Unix und Windows verwenden. Ich würde also argumentieren, dass JSvc und ProcRun.exe zusammen den plattformübergreifenden Servicecode erleichtern.
JSvc bietet einige interessante Java-spezifische Optionen, die für Sie nützlich sein können. Zum Beispiel wie man die JVM startet (Prozess oder DLL) usw. Sie können viele davon in ein Systemd-Skript schreiben, aber ich vermute, dass Sie JSvc an dieser Stelle nur in Bash umschreiben würden.
Daher ist es für Ihr spezielles Tomcat-Beispiel möglicherweise nicht sehr überzeugend. Die Verwendung des kleinen JSvc-Service-Wrappers gegenüber Systemd bietet jedoch einige Vorteile.
Sie sollten jsvc verwenden, wenn Sie Tomcat mit Nicht-Root-Berechtigungen, aber mit niedrigem Port (<1024) ausführen möchten.
Auch Deaktivieren des Shutdown-Ports wird verfügbar. Es kann jedoch nicht verwendet werden, wenn Tomcat mit den Standard-Shell-Skripts ausgeführt wird. Andernfalls wird verhindert, dass shutdown.bat | .sh und catalina.bat | .sh es ordnungsgemäß stoppen.