it-swarm.com.de

Welchen Nutzen habe ich von JSVC, wenn ich nur systemd verwende?

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:

  1. Es wird als root gestartet und ermöglicht die Verwendung eines privilegierten Ports (wie 80 oder 443).
  2. Es erstellt einen "Controller-Prozess", der einen "kontrollierten Prozess" (den Haupt-Java-Thread) überwacht und den Prozess bei einem Fehler erneut startet.

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.

23
user636044

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.

Privilegierte Steckdosen öffnen

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.

17
zbyszek

An diesem Punkt würde ich JSvc verwenden. Umhüllen Sie es jedoch mit einem Systemd-Skript, wenn ich müsste. 

  1. 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.

  2. 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.

  3. 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.

7
kervin

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.

0
user3132194