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

7

Eu escrevi um programa que usa um banco de dados Postgres, e eu 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 for concluída e o Postgres for iniciado novamente, meu serviço não será iniciado automaticamente.

Posso definir alguma dependência para que meu serviço seja iniciado novamente automaticamente?

Este é o status do meu serviço depois que ele foi interrompido automaticamente 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)

Note que posso iniciar manualmente o serviço novamente.

Este é 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

Eu tentei adicionar PartOf=postgresql.service e BindsTo=postgresql.service e, em seguida, parar e iniciar manualmente o Postgres, mas nenhum dos dois ajudou.

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

    
por Rennex 04.07.2017 / 00:46

1 resposta

9

Eu encontrei a resposta: eu precisava mudar 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 diretivas na seção [Install] afetam apenas a habilitação e a desativação de unidades. Mas não foi assim 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 foi enganosa. Consertar isso foi 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 começa sempre que o Postgres o faz. E, naturalmente, o Postgres é iniciado quando o sistema inicializa.

    
por 04.07.2017 / 22:50