Como sincronizar o systemd stop order de um serviço?

1

Suponha que eu tenha a.service , que não posso modificar, e b.service , que eu possa modificar. Quero ver esta ordem de parada:

Stopping b.service ...
Stopped b.service
Stopping a.service ...
Stopped a.service

em vez disso:

Stopping b.service ...
Stopping a.service ...
Stopped b.service
Stopped a.service

Suponha que b.service leve pelo menos 20 segundos para terminar.

    
por Marcus Linsner 03.09.2018 / 23:05

2 respostas

3

Para parar b.service antes de a.service , você precisa realmente pedir b.service após a.service , pois a ordem na hora da parada do serviço é o inverso da ordem no início tempo.

Então, isso deve ser suficiente para realizar o que você descreveu:

# b.service unit file
[Unit]
Description=...
After=a.service

[Service]
...

Veja a documentação para After= in man systemd.unit , que afirma:

Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down.

Você também perguntou sobre o que acontece se b.service demorar pelo menos 20 segundos para ser encerrado. Está bem. Se b.service estiver configurado corretamente, o systemd poderá monitorá-lo até que a parada da unidade seja concluída (em outras palavras, se ExecStop= não estiver de alguma forma configurada incorretamente) e parar antes do tempo limite ser atingido (consulte TimeoutStopSec= ), em seguida, o systemd esperará até que b.service seja completamente interrompido antes de inicializar o encerramento de a.service .

    
por 03.09.2018 / 23:26
1

Se você quiser apenas pará-los em uma determinada ordem, pode invocar a chamada para systemctl da seguinte forma:

 $ systemctl stop a.service && systemctl stop b.service

ou

 $ systemctl stop a.service; systemctl stop b.service
    
por 03.09.2018 / 23:42

Tags