Como obter meu serviço systemd reiniciado quando sua dependência é atualizada

11

Eu escrevi um programa que usa um banco de dados Postgres e escrevi um arquivo de serviço systemd para ele. Atualmente, meu serviço é iniciado na inicialização muito bem e é interrompido quando o Postgres é interrompido para atualização (por apt upgrade). No entanto, quando a atualização é concluída e o Postgres é iniciado novamente, meu serviço não é iniciado automaticamente.

Posso definir alguma dependência para iniciar meu serviço novamente automaticamente?

Este é o status do meu serviço depois que ele foi automaticamente interrompido durante a atualização do Postgres:

● tabill.service - My service
   Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
 Main PID: 1048 (code=killed, signal=TERM)

Observe que eu posso iniciar o serviço manualmente novamente corretamente.

Aqui está o meu arquivo de serviço:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

Tentei adicionar PartOf=postgresql.servicee BindsTo=postgresql.service, em seguida, interromper e iniciar manualmente o Postgres, mas nenhum deles ajudou.

É claro que eu poderia remover o arquivo Requires, mas é preferível interromper os dois serviços juntos, se eles iniciarem novamente.

Rennex
fonte
PartOf=Parece a solução certa. Você tentou Requires=remover?
Meu17 /
@meuh eu tentei agora com Requires=removido, isso não ajudou. Eu acho que o problema é que os PartOf=links "interrompem e reiniciam as unidades", mas o Postgres não é reiniciado durante uma atualização. Parou, atualizou e começou.
Rennex 04/07
Curiosamente, quando o faz systemctl restart postgresql, o systemd lembra de reiniciar seus serviços dependentes novamente. Parece que o apt, por alguma razão, combina stope startnão restart.
WGH 10/0318

Respostas:

13

Encontrei a resposta: precisava alterar a última linha do arquivo de serviço para:

WantedBy=postgresql.service

Dessa forma, sempre que o Postgres é iniciado, meu serviço também é iniciado - mas se meu serviço falhar, isso não interrompe o Postgres.

As diretrizes da [Install]seção afetam apenas a ativação e desativação de unidades. Mas não foi tão simples quando meu serviço já estava ativado:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

A mensagem de erro era enganosa. Corrigir era simples:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

Agora meu serviço para e inicia sempre que o Postgres o faz. E, naturalmente, o Postgres inicia quando o sistema é inicializado.

Rennex
fonte