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.