GNU/Linux >> Tutoriels Linux >  >> Linux

Arrêt de Systemd Unit avec un autre. Démarrage des travaux ?

Sur un serveur CentOS7, j'ai une pile d'applications composée d'un serveur Web Tomcat et d'un serveur de base de données MySQL, tous deux installés sur la même VM.
J'aimerais qu'ils démarrent et s'arrêtent ensemble dans cet ordre :

START: MySQL--> Tomcat
STOP: Tomcat-->MySQL

En lisant la documentation de l'unité systemd, j'ai réussi à les faire démarrer avec Requires= directive, mais lorsque j'arrête tomcat avec systemctl stop tomcat.service, MySQL continue de fonctionner. Dans les journaux système, j'ai remarqué qu'il n'essayait même pas d'arrêter MySQL, il doit donc y avoir un problème avec l'unité systemd.

Voici mon unité :

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target mysql.service
Requires=mysql.service

[Service]
Type=forking

Environment=JAVA_HOME=/opt/jdk
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

Réponse acceptée :

Ce que vous voyez ici est le comportement systemd attendu. Le Requires= la dépendance s'assurera que mysql.service est démarré chaque fois que tomcat.service démarre, mais une fois démarrées, les deux unités sont indépendantes et l'une ne s'arrêtera pas lorsque l'autre le sera.

Si vous voulez vraiment mysql.service à arrêter lorsque tomcat.service c'est-à-dire que vous pouvez utiliser le PartOf= directive qui relie les unités à l'arrêt et au redémarrage.

Pour l'exemple que vous avez décrit (avoir mysql.service s'arrêter à chaque fois que tomcat.service est arrêté), ce dont vous avez besoin est d'ajouter PartOf=tomcat.service à la définition de mysql.service . Habituellement, la meilleure façon de le faire est d'utiliser un fichier de remplacement, ce que vous pouvez faire avec systemctl edit mysql.service qui ouvrira un éditeur de texte avec un fichier vide, vous pourrez alors y ajouter cet extrait :

[Unit]
PartOf=tomcat.service

Cela sera enregistré dans un fichier /etc/systemd/system/mysql.service.d/override.conf qui devient une partie de mysql.service , vous pouvez vérifier cela avec systemctl cat mysql.service .

Après ces changements et un systemctl daemon-reload , cela devrait fonctionner comme prévu…

Concernant la commande, tout devrait fonctionner comme prévu avec le seul After=mysql.service vous avez dans tomcat.service , puisque les dépendances sont respectées dans l'ordre inverse lors de l'arrêt des services. (Ce qui signifie, dans ce cas, tomcat.service sera arrêté en premier, suivi de mysql.service .)

Arrêter les unités de cette façon n'est peut-être pas toujours une bonne idée… Peut-être qu'une approche légèrement meilleure consiste à créer un .target séparé unité pour regrouper tous les services que vous souhaitez contrôler ensemble. Peut-être quelque chose comme webservices.target .

Vous créeriez cette unité avec des contenus tels que :

[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service

[Install]
WantedBy=multi-user.target

Et puis avoir les deux tomcat.service et mysql.service définir un PartOf=webservices.target , en utilisant le mécanisme de remplacement décrit ci-dessus.

Connexe :le sélecteur de date Bootstrap ne fonctionne que sur la première ligne de GridView ?

Activez l'unité cible avec systemctl enable webservices.target , puis vous pouvez démarrer et arrêter les deux services avec systemctl start webservices.target ou systemctl stop webservices.target .


Linux
  1. 10 commandes systemd pratiques :une référence

  2. Pourquoi Systemd arrête-t-il le service immédiatement après son démarrage ?

  3. Comment configurer Systemd pour transformer un script simple avec Standardio dans un service réseau ?

  4. Comment arrêter le service systemd

  5. Comment obtenir moins de ttys avec Systemd ?

Comment exécuter Jenkins Container en tant que service Systemd avec Docker

Comment exécuter des conteneurs en tant que service Systemd avec Podman

Liste des services Linux avec Systemctl

Commandes Systemctl pour gérer le service Systemd

Installer et exécuter Jenkins avec Systemd et Docker

Gestion des cgroups avec systemd