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
.