Obrigado pelas sugestões e pelo seu tempo. Consegui isso via serviço systemd com
Restart=always
e duas entradas de crontab como sugerido por @JdeBP
- um para começar às 08:00
- outro para parar às 17:00
Eu tenho um arquivo de unidade systemd, sei que ele 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, quero reiniciar apenas se a hora do sistema estiver entre o período de tempo especificado, digamos entre as 08:00 e as 17:00, somente depois 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 e wibble-out-of-hours.conf
com essas configurações desativadas. Não esqueça o cabeçalho da seção. /etc/systemd/system/wibble.service.d/restart.conf
é um ou outro desses arquivos. O manual do systemd (q.v.) explica os diretórios e os arquivos de fragmentos. systemctl daemon-reload
e, é claro, ativar o serviço se ele tiver terminado durante o expediente período. (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, e todos fazem o teste de iniciar o serviço de forma 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 o tempo todo, você poderá implementar isso de maneira simples com uma unidade de serviço + um correspondente unidade temporizadora.
Basta que a unidade do timer especifique seu período de tempo em um OnCalendar=
configuração.
Por exemplo, para executar uma vez por minuto das 08:00 às 16:59 (geralmente no segundo 00, mas dê uma folga de 5 segundos ao sistema para agendá-lo):
[Timer]
OnCalendar=*-*-* 08-16:*:00
AccuracySec=5s
Além disso, tenha Restart=no
(ou deixe de fora Restart=
, pois no
é o padrão) na sua unidade de serviço.
Esta configuração terá o systemd tentando 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 interrompida e o temporizador for disparado (uma vez por minuto dentro desse intervalo de tempo), ela irá efetivamente "reiniciar" a unidade.
O efeito líquido é que este temporizador fará com que a unidade reinicie entre 0s e 65s (contando o intervalo de 5s) depois que ele parar, mas somente dentro do seu tempo (já que seu temporizador só dispara durante essas horas.)
Se ter 0s como limite inferior for inaceitável (digamos que você queira pelo menos 30 segundos entre a unidade parar e depois 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 parada do serviço principal, ainda serão necessários 30 segundos para que a unidade seja efetivamente "parada" e, portanto, só será elegível para reiniciar a partir da unidade temporizada após esses 30 anos terem decorrido. Com efeito, isso faz com que seja reiniciado dentro de 30 a 95 segundos de quando parou.
Consulte a página man do systemd.time para obter mais detalhes sobre como especificar intervalos para OnCalendar=
, para que você possa ajustá-lo aos requisitos de tempo específicos em sua política de reinicialização.
Tags systemd systemd-timer