La documentation Tomcat décrit le processus de compilation et d'installation JSVC qui peut être utilisé pour exécuter Tomcat en tant que démon. Selon ma compréhension, JSVC présente deux avantages:
J'ai appris systemd _, y compris le configuration de l'unité de service . Sur la base de ma compréhension limitée, systemd peut effectuer les mêmes tâches que JSVC si je mets User=Tomcat
(en utilisant le nom d'utilisateur souhaité) et Restart=on-failure
dans mon fichier de configuration Tomcat.service
.
En utilisant JSVC, je m'attendrais à ce que Tomcat.service
ressemble à ceci:
[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
Avec systemd, je m'attendrais à ce que Tomcat.service
ressemble à ceci:
[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
Ma préférence est simplement d'utiliser systemd car il est déjà là et je dois (dois) l'utiliser de toute façon. Je ne suis toutefois pas sûr de savoir si je vais rater tout avantage d'utiliser JSVC que je néglige.
Que peut faire JSVC et que ne peut pas réaliser systemd si je veux exécuter Tomcat en tant que démon?
En outre, si systemd est capable d'effectuer les mêmes tâches que JSVC et JSVC, j'aimerais également vous demander des conseils de configuration que vous pourriez offrir pour optimiser les avantages de JSVC en utilisant simplement systemd.
En général, la plupart des fonctionnalités fournies par jsvc sont fournies par systemd, à l'exception de l'ouverture de ports privilégiés (voir ci-dessous). Si possible, il est très judicieux de passer directement à la fonctionnalité systemd car les choses deviennent plus simples et plus efficaces.
Votre fichier d'unité semble généralement correct, à l'exception de
ExecStart=/opt/Tomcat/bin/startup.sh
ExecStop=/opt/Tomcat/bin/shutdown.sh
Cette partie ressemble à une autre enveloppe qui peut être remplacée par une adresse directe à Java -jar ...
.
Sous Systemd, cela se fait généralement via l'activation du socket. Systemd ouvre le socket et le transmet au démon sous forme de descripteur de fichier ouvert (comme stdin, stdout, stderr).
Le démon peut ensuite être démarré en tant qu'utilisateur sans privilège et ne supprime pas les privilèges lui-même. Le démon doit supporter cela, et au lieu d'ouvrir le socket par lui-même, il devrait utiliser celui qui lui a été donné. Sous Java, cela est rendu très problématique par le manque de support dans la stdlib Java.
Autant que je sache, Tomcat ne prend pas en charge l'activation de socket. Par conséquent, si vous souhaitez utiliser un port privilégié et exécuter le démon sous un utilisateur sans privilège, jsvc peut toujours être nécessaire.
À ce stade, j'utiliserais JSvc. Mais enveloppez-le avec un script Systemd si je devais le faire.
Gardez à l'esprit que JSvc n'est qu'un autre exécutable. Ainsi, un utilisateur système ordinaire peut configurer un service JSvc par exemple. Il est prudent de dire que sur la plupart des distributions, Systemd requiert la configuration des privilèges root.
J'ai également écrit des programmes Java utilisant JSvc et ProcRun.exe en encapsulant une petite interface Java. Cela me permet d’utiliser le même code de service et même des tests d’intégration JUnit sur les systèmes d’exploitation Unix et Windows. Je dirais donc que JSvc et ProcRun.exe facilitent le code de service multiplate-forme.
JSvc propose des options intéressantes spécifiques à Java qui peuvent vous être utiles. Par exemple, comment démarrer la machine virtuelle Java (processus ou DLL), etc. Vous pouvez en écrire beaucoup dans un script Systemd, mais je suppose que vous ne feriez que réécrire JSvc dans Bash à ce stade.
Alors peut-être que ce n'est pas très convaincant pour votre exemple Tomcat spécifique. Mais l’utilisation du minuscule wrapper de services JSvc sur Systemd présente certains avantages.
Vous devez utiliser jsvc si vous souhaitez exécuter Tomcat avec des privilèges non root mais avec un port faible (<1024).
De plus, la désactivation du port d'arrêt devient disponible. Cependant, il ne peut pas être utilisé lors de l'exécution de Tomcat avec les scripts Shell standard, car cela empêchera shutdown.bat | .sh et catalina.bat | .sh de l'arrêter normalement.