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.service
e 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.
fonte
PartOf=
Parece a solução certa. Você tentouRequires=
remover?Requires=
removido, isso não ajudou. Eu acho que o problema é que osPartOf=
links "interrompem e reiniciam as unidades", mas o Postgres não é reiniciado durante uma atualização. Parou, atualizou e começou.systemctl restart postgresql
, o systemd lembra de reiniciar seus serviços dependentes novamente. Parece que o apt, por alguma razão, combinastop
estart
nãorestart
.Respostas:
Encontrei a resposta: precisava alterar a última linha do arquivo de serviço para:
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:A mensagem de erro era enganosa. Corrigir era simples:
Agora meu serviço para e inicia sempre que o Postgres o faz. E, naturalmente, o Postgres inicia quando o sistema é inicializado.
fonte