Não é uma solução perfeita, mas em vez de ExecStartPre
você pode usar Conflicts
.
A space-separated list of unit names. Configures negative requirement dependencies. If a unit has a Conflicts= setting on another unit, starting the former will stop the latter and vice versa. Note that this setting is independent of and orthogonal to the After= and Before= ordering dependencies.
Você pode combinar isso com um ExecStopPost
que verifica se o conflito está ativado:
ExecStopPost=/usr/bin/systemctl is-enabled borgmount.service && /usr/bin/systemctl --user start borgmount.service
Se você não estiver familiarizado com o operador &&
, se o primeiro comando for bem-sucedido, o segundo será executado. systemctl is-enabled
retorna 0 quando a unidade está ativada.
Ainda não abrange o caso de uso em que o serviço foi ativado e interrompido, mas você provavelmente ainda poderia manipular um ExecStopPost
mais complexo ou até mesmo determinar o estado em ExecStartPre
. É muito ruim systemd
não ter uma diretiva Interupts
ou similar, para parar outra unidade apenas enquanto a unidade estiver funcionando.
Em vez de um ExecStartPost
, você também pode especificar Conflicts=
em borgmount.service
e, em vez de executar apenas systemctl start borgbackup.service
, pode executar systemctl start borgbackup.service borgmount.service
, mas isso exige que você lembre de executar ambos.
Outra alternativa (provavelmente a mais limpa) seria usar o Conflicts
em ambos os serviços e criar um novo alvo para backup que inclua ambos os serviços.
borgbackup.service
precisaria:
Before=borgmount.service
para garantir que seja executado primeiro
WantedBy=${NEW_TARGET}
para garantir que a execução do novo destino faça com que seja executado.
borgmount.service
precisaria:
WantedBy=${NEW_TARGET}
, você pode especificar várias diretivas WantedBy
em uma unidade.
Depois, você pode acionar seu backup usando systemctl start ${NEW_TARGET}
.
O bom desse método é que, se borgmount.service
não estiver ativado, ele não será executado no ${NEW_TARGET}
e, se você quiser acionar o backup sem executar borgmount.service
, poderá chamar o borgbackup.service
em seu próprio.