Eu tenho o arquivo de unidade systemd, sei que pode ser reiniciado em caso de falha, fornecendo parâmetros, como:
Restart=always
RestartSec=90
Ele será reiniciado após 90 segundos sempre que falhar,
Mas, eu quero reiniciar apenas se a hora do sistema estiver entre um determinado período de tempo, digamos, entre 08:00 e 17:00, só então reinicie.
Existe uma maneira de fazer isso via systemd?
Diretamente em um arquivo de unidade de serviço com configurações: não.
Com um mecanismo de Heath Robinson: sim, como segue.
wibble-in-hours.conf
com essas configurações ativadas ewibble-out-of-hours.conf
com essas configurações desativadas. Não se esqueça do título da seção./etc/systemd/system/wibble.service.d/restart.conf
é um ou outro desses arquivos. O manual do systemd (qv) explica diretórios drop-in e arquivos de trecho.systemctl daemon-reload
e, é claro, ative o serviço se ele for encerrado durante o período fora do horário comercial. (Esteja ciente do mascaramento, dos serviços desabilitados e do fato de que alguns sistemas operacionais interrompem os serviços temporariamente durante as atualizações de pacotes, todos os quais tornam o teste de iniciar o serviço não trivial.)Se for aceitável para você que o intervalo para a reinicialização não seja exatamente 90 segundos e não seja exatamente o mesmo todas as vezes, você poderá implementar isso de maneira simples com uma unidade de serviço + uma unidade de temporizador correspondente.
Basta fazer com que a unidade do temporizador especifique seu período de tempo em uma
OnCalendar=
configuração.Por exemplo, para executar uma vez por minuto das 08:00 às 16:59 (geralmente no segundo 00, mas dê ao systemd uma margem de 5 segundos para agendá-lo):
Além disso, tenha
Restart=no
(ou deixe de foraRestart=
, já queno
é o padrão) em sua unidade de serviço.Esta configuração fará com que o systemd tente iniciar sua unidade uma vez por minuto dentro do seu período de tempo. No entanto, se a unidade já estiver em execução, tentar iniciá-la não fará nada.
Se, por outro lado, a unidade for parada e o temporizador disparar (uma vez por minuto dentro desse período de tempo), ele irá "reiniciar" a unidade.
O efeito líquido é que este cronômetro fará com que a unidade reinicie entre 0s e 65s (contando os 5s de margem de manobra) depois de parar, mas apenas dentro do seu prazo (já que seu cronômetro só dispara durante essas horas).
Se ter 0s como limite inferior for inaceitável (digamos, você deseja pelo menos 30s entre a unidade parar e iniciar novamente), você pode usar uma solução alternativa para isso adicionando um
ExecStopPost=/bin/sleep 30
à unidade de serviço. Dessa forma, após a interrupção do serviço principal, ainda levará 30s para que a unidade seja efetivamente "parada" e, portanto, só poderá ser reiniciada a partir da unidade do temporizador após esses 30s. Na verdade, isso faz com que ele reinicie dentro de 30 a 95 segundos a partir do momento em que parou.Consulte a página man do systemd.time para obter mais detalhes sobre como especificar intervalos para
OnCalendar=
que você possa ajustá-lo aos requisitos de tempo específicos em sua política de reinicialização.Obrigado pelas sugestões e pelo seu tempo. Eu consegui isso através do serviço systemd com
Restart=always
e duas entradas crontab como sugerido por @JdeBP