Um temporizador monotônico do systemd é um tipo de agendamento que inicia sua contagem a partir de um ponto de referência temporal específico, como a inicialização do sistema ou o início de um serviço. Ao contrário dos temporizadores baseados no relógio do sistema (como OnCalendar), ele dispara após um intervalo de tempo relativo a esse evento de referência, tornando-o imune a alterações manuais no relógio do sistema. Isso é particularmente útil para agendar tarefas que devem ocorrer em intervalos regulares após a inicialização ou para implementar atrasos na execução de um serviço.
Criação da Tarefa e da Unidade de Serviço
Primeiro, vamos criar um script de tarefa e o arquivo de unidade de serviço correspondente. Este exemplo monitora o status de um serviço hipotético e registra a saída.
1. Script de tarefa:
#!/bin/bash
# tarefa_monitoramento.sh
STATUS=$(systemctl is-active ssh)
echo "$(date): Status do serviço SSH = ${STATUS}" >> /var/log/status_servico.log
Torne-o executável:
chmod +x /tarefa_monitoramento.sh
2. Unidade de Serviço: Crie o arquivo servico_monitoramento.service em /etc/systemd/system/.
[Unit]
Description=Serviço de Monitoramento Periódico
[Service]
Type=oneshot
ExecStart=/tarefa_monitoramento.sh
Configuração da Unidade de Temporizador
Em seguida, crie a unidade de temporizador (timer_monitoramento.timer) na mesma pasta. As diretivas OnBootSec e OnUnitActiveSec são a essência do agendamento monotônico.
[Unit]
Description=Temporizador para executar monitoramento periodicamente
[Timer]
OnBootSec=60s
OnUnitActiveSec=300s
AccuracySec=1s
[Install]
WantedBy=timers.target
Nesta configuração, a tarefa será executada 60 segundos após a inicialização do sistema (OnBootSec=60s) e, subsequentemente, a cada 300 segundos (5 minutos) a partir da última ativação (OnUnitActiveSec=300s). A diretiva AccuracySec define a tolerância do agendador para agrupar ativações.
Considerações de Segurança (SELinux)
Se o SELinux estiver em modo Enforcing, ele pode bloquear a execução do script pelo systemd. Para verificar o estado atual:
getenforce
Se necessário e em ambientes de teste, o modo pode ser alterado temporariamente para Permissive com:
setenforce 0
Lembre-se de redefinir a política do SELinux ou criar as regras de contexto apropriadas para ambientes de produção.
Ativação e Verificação
Após criar os arquivos, recarregue a configuração do daemon do systemd:
systemctl daemon-reload
Ative e inicie o temporizador (não o serviço diretamente):
systemctl enable timer_monitoramento.timer
systemctl start timer_monitoramento.timer
Para verificar se o temporizador está agendado e ativo:
systemctl list-timers --all
systemctl status timer_monitoramento.timer
Após o tempo especificado (OnBootSec), o temporizador acionará a unidade servico_monitoramento.service. Você pode acompanhar o log gerado pelo script para confirmar a execução:
tail -f /var/log/status_servico.log