Adicionando atraso entre a parada e o início de um processo no systemd


10

Eu tenho um problema muito estranho com systemd. Quando eu emitir um, systemctl restartele iniciará o novo processo antes que o anterior termine.

Isso pode ser visto no log, onde a mensagem final de desligamento ("log de fechamento") é registrada após a mensagem de inicialização ("log de abertura").

Existe alguma maneira de adicionar um atraso entre a parada e o início do processo?


Nada que você parar de corrersystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti

Por que isso é estranho? É um recurso de design que o deixa em paz para solucionar problemas do mundo real. Injete o sono na inicialização da sua unidade ou use uma condição ExecPre para garantir que a instância antiga se foi completamente.
Florian Heigl

Respostas:


13

Nos arquivos de serviço do systemd, você pode definir a opção RestartSec para adicionar um atraso para a reinicialização. Veja o exemplo abaixo:

[Service]
Restart=always
RestartSec=30

Verifique este link para mais exemplos.


1
afaik RestartSecsó se aplica aos serviços configurados com a Restart=directiva e não é levado em conta quando se faz umsystemctl restart someservice
don_crissti

1

O RestartSec parece ser usado apenas se esse serviço específico for o reiniciado por meio do comando systemctl restart.

Por exemplo, eu tenho dois serviços, A e B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

e

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Se você fizer uma reinicialização do systemctl B, funcionará conforme o esperado ... mas se você fizer uma reinicialização do systemctl A, os dois serviços serão interrompidos e iniciados imediatamente novamente, sem demora.

Aparentemente, o Systemd está usando apenas os valores de configuração para o serviço especificado e os ignorando para quaisquer dependências.

Isso não é tão incomum quanto parece. Se B falar com um servidor remoto, iniciar e parar rapidamente poderá falhar devido à rejeição remota do cliente pela extremidade remota. Mas reiniciar A diretamente acontecerá sempre que A for atualizado sem uma alteração em B.

Provavelmente, você pode contornar isso adicionando o atraso a A também, mas você NÃO PRECISA fazer isso, pois quebra o isolamento do objeto, informando A sobre B quando A não é uma dependência.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.