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