web-dev-qa-db-fra.com

Quel est l'avantage de JSVC par rapport à l'utilisation de systemd?

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:

  1. Il se lance en tant que root permettant l’utilisation d’un port privilégié (comme 80 ou 443).
  2. Il crée un "processus de contrôleur" qui surveillera un "processus contrôlé" (le fil principal Java) et le relancera en cas d'échec.

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.

23
user636044

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

Ouverture de sockets privilégiés

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.

17
zbyszek

À ce stade, j'utiliserais JSvc. Mais enveloppez-le avec un script Systemd si je devais le faire. 

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

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

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

7
kervin

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.

0
user3132194