Parando a unidade systemd junto com outra. Começando obras

1

Em um servidor CentOS7 eu tenho uma pilha de aplicativos composta por um servidor web Tomcat e um servidor MySQL DB, ambos instalados na mesma VM. Eu gostaria que eles começassem e parassem juntos nesta ordem:

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

Lendo a documentação da unidade do systemd, eu consegui fazer com que eles iniciassem junto com a diretiva Requires= , mas quando eu paro o tomcat com systemctl stop tomcat.service, o MySQL continua rodando. Nos logs do sistema, notei que ele nem tenta parar o MySQL, então deve haver algo errado com a unidade systemd.

Aqui está minha unidade:

# 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
    
por J.B. 26.04.2018 / 16:09

1 resposta

2

O que você está vendo aqui é o comportamento esperado do sistema. A dependência Requires= fará com que mysql.service seja iniciado sempre que tomcat.service for iniciado, mas uma vez iniciado, as duas unidades serão independentes e uma não será interrompida quando a outra for.

Se você realmente quer que mysql.service seja interrompido quando tomcat.service é, você pode usar o PartOf= directive que liga as unidades ao parar e reiniciar.

Para o exemplo que você descreveu (com mysql.service parar sempre que tomcat.service for interrompido), o que você precisa é adicionar PartOf=tomcat.service à definição de mysql.service . Normalmente, a melhor maneira de fazer isso é usar um arquivo de substituição, o que você pode fazer com systemctl edit mysql.service , que abrirá um editor de texto com um arquivo vazio, e você poderá adicionar este snippet a ele:

[Unit]
PartOf=tomcat.service

Isso será salvo em um arquivo /etc/systemd/system/mysql.service.d/override.conf que se torna parte de mysql.service , você pode verificar isso com systemctl cat mysql.service .

Após essas alterações e um systemctl daemon-reload , isso deve funcionar conforme o esperado ...

Em relação ao pedido, tudo deve funcionar como esperado com o único After=mysql.service que você tem em tomcat.service , pois as dependências são respeitadas na ordem inversa ao interromper os serviços. (O que significa, neste caso, tomcat.service será parado primeiro, seguido por mysql.service .)

Parar as unidades dessa maneira pode nem sempre ser uma boa ideia ... Talvez uma abordagem um pouco melhor seja criar um .target unit para agrupar todos os serviços que você deseja controlar juntos. Talvez algo como webservices.target .

Você criaria essa unidade com conteúdo como:

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

[Install]
WantedBy=multi-user.target

Em seguida, os dois tomcat.service e mysql.service definiram um PartOf=webservices.target , usando o mecanismo de substituição descrito acima.

Ative a unidade de destino com systemctl enable webservices.target e, em seguida, inicie e pare os dois serviços junto com systemctl start webservices.target ou systemctl stop webservices.target .

    
por 26.04.2018 / 17:55

Tags