Como parar os serviços do systemd em uma ordem específica

4

Como posso garantir que uma ordem específica seja seguida quando um serviço systemd específico é interrompido? Eu tenho vários serviços / unidades systemd que tenho em execução, mas uso recursos em várias partições montadas. Essas partições são montadas e desmontadas usando um serviço personalizado. Os serviços em execução (por exemplo, ProgramA.service & ProgramB.service) precisam ser interrompidos em uma ordem específica ANTES de o programa de montagem personalizado ser interrompido.

Configurar dependências de inicialização é bastante simples, mas não consegui descobrir como garantir que os serviços sejam interrompidos antes que meu serviço de montagem seja interrompido.

mountCustomPartitions.service

[Unit]
Description=My Custom Partition Mounting Service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mountCustomPartitions.sh mount
ExecStop=/usr/bin/mountCustomPartitions.sh unmount

[Install]
WantedBy=multi-user.target

ProgramA.service

[Unit]
Description=My Generic Program A Service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service

[Service]
Type=simple
ExecStart=/usr/bin/ProgramA

[Install]
WantedBy=multi-user.target

ProgramB.service

[Unit]
Description=My Generic Program B Service
Requires=ProgramA.service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service ProgramA.service

[Service]
Type=simple
ExecStart=/usr/bin/ProgramB

[Install]
WantedBy=multi-user.target

No meu cenário acima, mountCustomPartitions.service deve ser iniciado antes dos serviços do programa, mas também deve ser interrompido após eles. Se mountCustomPartitions.service for explicitamente interrompido, deverá fazer com que os outros parem também (mas deve aguardar que sejam parados). Eu também preciso ter certeza de que o ProgramB é iniciado após o ProgramA, mas também parou antes do ProgramA. Espero que isso não seja muito confuso.

A única solução que consigo pensar é que cada serviço tenha uma linha ExecStop que execute um comando systemctl stop [service] para o serviço específico que deve ser interrompido antes de parar. O problema que tenho com isso é que eu atualmente tenho seis serviços que usam as partições montadas e devem ser interrompidos antes de tentar uma desmontagem. Desses seis, alguns precisam ser parados em uma ordem específica. Como isso está sendo usado em um produto comercial, eu esperava que houvesse uma solução mais limpa.

    
por ForeverACE 20.06.2016 / 22:40

1 resposta

5

Você controla a ordem de encerramento especificando Before= e After= nos arquivos da unidade para descrever a ordem inicialização . A ordem inversa é aplicada ao desligar.

Veja o que os documentos oficiais têm a dizer sobre isso:

...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...

    
por 21.06.2016 / 18:39

Tags