Estou tentando criar dependências entre dois serviços descritos em systemd
arquivos de unidade:
- a.service deve começar antes de b.service
- b.service não pode iniciar se a.service falhar
Aqui está o que eu tenho:
% cat a.service
[Unit]
Description=A-Service
Before=b.service
[Service]
ExecStart=/opt/a.sh
[Install]
WantedBy=multi-user.target
% cat b.service
[Unit]
Description=B-Service
After=a.service
[Service]
ExecStart=/opt/b.sh
[Install]
WantedBy=multi-user.target
E estes são scripts simples executados para o serviço A e B:
% cat a.sh
#!/bin/sh
echo "A service started"
exit 0
% cat b.sh
#!/bin/sh
echo "B service started"
while [ true ]; do
sleep 1
do
exit 0
Então eu tentei emular uma falha de serviço retornando exit 1
de a.sh
, systemctl status a.service
relata como falhou:
Active: failed (Result: exit-code) ...
Process: 843 ExecStart=/opt/a.sh (code=exited, status=1/FAILURE)
...
No entanto, o b.service ainda inicia e está ativo:
% systemctl status b.service
...
Active: active (running) ...
Process: 844 ExecStart=/opt/b.sh (code=exited, status=0/SUCCESS)
...
Além disso, as dependências de b.service contêm a.service (com status Fail):
% systemctl list-dependencies b.service
...
O que estou fazendo errado? É um problema com os scripts ou a definição de [Unidade] não está completa?
Eu usaria um
Requires
atributo na segunda unidade:Também alterei o Tipo de cada unidade para bifurcação, já que o tipo padrão "simples" considerará a unidade iniciada assim que o shell for iniciado, enquanto uma unidade bifurcada aguardará a saída do shell. Essa mudança de tipo é crítica aqui apenas para A-Service.
Eu também removi
Before=b.service
do A-Service, já que uma dependência inversa de B -to- A (com a diretiva "Depois" de B) faz mais sentido para mim e você não precisa ter os dois.Os arquivos de unidade resultantes são:
e: