En un servidor CentOS7, tengo una pila de aplicaciones compuesta por un servidor web Tomcat y un servidor de base de datos MySQL, ambos instalados en la misma VM.
Me gustaría que se iniciaran y detuvieran juntos en este orden:
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
Al leer la documentación de la unidad systemd, logré que comenzaran juntos con Requires=
directiva, pero cuando detengo tomcat con systemctl stop tomcat.service, MySQL sigue ejecutándose. En los registros del sistema noté que ni siquiera intenta detener MySQL, por lo que debe haber algún problema con la unidad systemd.
Aquí está mi unidad:
# 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
Respuesta aceptada:
Lo que está viendo aquí es el comportamiento esperado de systemd. El Requires=
la dependencia se asegurará de que mysql.service
se inicia siempre que tomcat.service
arranca, pero una vez arrancados, las dos unidades son independientes y una no se detendrá cuando la otra sí lo haga.
Si realmente quieres mysql.service
para detenerse cuando tomcat.service
es decir, puedes usar el PartOf=
directiva que vincula unidades en parada y reinicio.
Para el ejemplo que describiste (tener mysql.service
detener siempre que tomcat.service
está detenido), lo que necesita es agregar PartOf=tomcat.service
a la definición de mysql.service
. Por lo general, la mejor manera de hacerlo es usar un archivo de anulación, que puede hacer con systemctl edit mysql.service
que abrirá un editor de texto con un archivo vacío, luego puede agregarle este fragmento:
[Unit]
PartOf=tomcat.service
Esto se guardará en un archivo /etc/systemd/system/mysql.service.d/override.conf
que pasa a formar parte de mysql.service
, puede comprobarlo con systemctl cat mysql.service
.
Después de esos cambios y un systemctl daemon-reload
, esto debería funcionar como esperas...
Con respecto a los pedidos, todo debería funcionar como esperas con el único After=mysql.service
tienes en tomcat.service
, ya que las dependencias se respetan en orden inverso al detener los servicios. (Lo que significa, en este caso, tomcat.service
se detendrá primero, seguido de mysql.service
.)
Detener las unidades de esta manera puede no ser siempre una buena idea... Tal vez un enfoque un poco mejor sea crear un .target
separado. unidad para agrupar todos los servicios que desea controlar juntos. Tal vez algo como webservices.target
.
Crearías esa unidad con contenidos como:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
Y luego tenga ambos tomcat.service
y mysql.service
establecer un PartOf=webservices.target
, utilizando el mecanismo de anulación descrito anteriormente.
Habilite la unidad de destino con systemctl enable webservices.target
y luego puede iniciar y detener ambos servicios junto con systemctl start webservices.target
o systemctl stop webservices.target
.