GNU/Linux >> Tutoriales Linux >  >> Linux

Detener la unidad Systemd junto con otra. ¿Inicio de obras?

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.

Relacionado:¿El selector de fecha Bootstrap solo funciona en la primera fila de GridView?

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 .


Linux
  1. Cómo administrar los servicios de Systemd con Systemctl en Linux

  2. 10 comandos prácticos de systemd:una referencia

  3. Linux:¿cómo obtener menos Ttys con Systemd?

  4. Cómo resolver el servicio MySQL que se inicia y se detiene inesperadamente

  5. ¿Cómo ejecutar un script con systemd justo antes de apagar?

Cómo ejecutar Jenkins Container como servicio Systemd con Docker

Cómo ejecutar contenedores como servicio Systemd con Podman

Listado de servicios de Linux con Systemctl

Comandos Systemctl para administrar el servicio Systemd

Instale y ejecute Jenkins con Systemd y Docker

Administrar cgroups con systemd