Nesta aula, vamos explorar os systemd timers, uma poderosa ferramenta de agendamento de tarefas integrada ao systemd, o gerenciador de serviços padrão na maioria das distribuições Linux modernas. Embora o cron seja amplamente utilizado e conhecido, os timers oferecem vantagens significativas em termos de integração com o ecossistema systemd, monitoramento, logs e flexibilidade. Vamos entender como eles funcionam, suas unidades básicas, quando preferi-los ao cron, e ver exemplos práticos de criação e gerenciamento.

Os systemd timers são units que agendam a execução de outras units (geralmente serviços). Eles podem ser baseados em tempo (como cron) ou em eventos (como boot, mudanças de arquivos). Nesta visão geral, focaremos nos timers baseados em tempo, mas mencionaremos as possibilidades de eventos. Ao final, você terá uma base sólida para começar a usar timers em seus próprios projetos.

Timers vs cron

O cron é um agendador de tarefas clássico no Unix, que executa comandos em horários específicos definidos em arquivos crontab. Ele é simples e amplamente suportado, mas tem algumas limitações: não fornece integração nativa com serviços, logs centralizados ou gerenciamento de dependências. Já os systemd timers são mais modernos e se integram profundamente ao systemd, oferecendo:

  • Integração com serviços: os timers disparam units de serviço, que podem ser gerenciadas com systemctl, com controle de estado, dependências e reinicialização automática.
  • Logs estruturados: as saídas dos serviços são capturadas pelo journald, facilitando a depuração e auditoria.
  • Agendamento flexível: suporta calendários complexos (como 'segunda a sexta às 9h') e também eventos relativos (como '5 minutos após o boot').
  • Persistência e recuperação: se o sistema estava desligado no horário agendado, o timer pode executar a tarefa na próxima ativação (com Persistent=true).
  • Monitoramento: é possível ver o próximo horário de execução, a última execução, e o status com systemctl status.

No entanto, o cron ainda é útil em ambientes muito simples ou quando você não quer lidar com systemd. Para a maioria dos casos modernos, os timers são recomendados.

Units básicas

Os systemd timers envolvem dois tipos principais de units:

  • Timer unit (.timer): define o agendamento, ou seja, quando e com que frequência o serviço deve ser ativado. Exemplo: meu-servico.timer.
  • Service unit (.service): define o trabalho a ser executado. Exemplo: meu-servico.service.

Além disso, há a unit target, que é um agrupamento de units (como timers.target), mas você não precisa criar targets próprios normalmente.

Um arquivo .timer típico possui uma seção [Timer] com diretivas como OnCalendar, OnBootSec, OnUnitActiveSec, Persistent, e uma seção [Install] com WantedBy=timers.target para ativação. O .service é como qualquer outro serviço systemd, mas geralmente é do tipo oneshot (executa uma vez) para tarefas agendadas.

Quando usar

Você deve considerar usar systemd timers nos seguintes cenários:

  • Quando o sistema já usa systemd (praticamente todas as distros modernas).
  • Quando você precisa de logs unificados e monitoramento fácil.
  • Quando a tarefa pode ser executada como um serviço (com dependências, ambiente, etc.).
  • Quando você precisa de agendamento mais complexo que o cron, como 'todo dia útil às 14h' ou 'a cada 2 horas apenas durante o dia'.
  • Quando quer garantir que a tarefa seja executada mesmo após o sistema ter ficado desligado no horário programado.

Por outro lado, o cron pode ser mais simples para tarefas rápidas e sem necessidade de integração, mas mesmo assim você pode criar um timer com um serviço que executa um comando simples.

Exemplos

Vamos criar um exemplo prático: um timer que executa um script de backup todos os dias às 2h da manhã.

Primeiro, crie o script de backup (ex.: /usr/local/bin/backup.sh):

#!/bin/bash
echo "Backup iniciado em $(date)" >> /var/log/backup.log
# Comandos de backup...
echo "Backup concluído em $(date)" >> /var/log/backup.log

Dê permissão de execução: chmod +x /usr/local/bin/backup.sh.

Agora, crie o arquivo de serviço /etc/systemd/system/backup.service:

[Unit]
Description=Executa o backup diário

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Em seguida, o timer /etc/systemd/system/backup.timer:

[Unit]
Description=Agenda o backup diário às 2h

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Ative e inicie o timer:

sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

Verifique o status:

sudo systemctl status backup.timer

Você verá a próxima execução agendada. Para listar todos os timers ativos:

systemctl list-timers

Outro exemplo: um timer que executa um serviço 5 minutos após o boot. Crie um serviço meu-servico.service e um timer com OnBootSec=5min.

[Timer]
OnBootSec=5min

Você pode combinar várias diretivas, como OnCalendar e OnUnitActiveSec para repetição após a última ativação.

Boas práticas e observações finais

Ao trabalhar com timers, considere:

  • Sempre use Persistent=true se a tarefa deve ser executada mesmo se o sistema estava desligado no horário.
  • Use RandomizedDelaySec para evitar picos de carga quando muitos timers disparam ao mesmo tempo.
  • Monitore seus timers com systemctl list-timers e verifique os logs com journalctl -u backup.service.
  • Teste o serviço manualmente antes de agendar: sudo systemctl start backup.service.
  • Documente suas units para facilitar a manutenção.

Os systemd timers são uma ferramenta robusta e recomendada para agendamento em sistemas modernos. Com a prática, você vai preferi-los ao cron.

Referências

Exercícios

  1. Crie um timer que execute um serviço chamado meu-servico.service todos os dias às 6h30 da manhã. Escreva o conteúdo do arquivo .timer.

    ✓ Resposta:
    [Unit]
    Description=Executa meu-servico diariamente às 6:30
    
    [Timer]
    OnCalendar=*-*-* 06:30:00
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
  2. Qual é a diferença entre OnCalendar e OnBootSec? Dê um exemplo de uso para cada.

    ✓ Resposta:

    OnCalendar define um agendamento baseado em calendário (como 'todas as segundas às 3h'). OnBootSec define um tempo relativo após a inicialização do sistema (ex.: '5min'). Exemplo: OnCalendar=Mon..Fri 03:00:00 para dias úteis às 3h; OnBootSec=10min para executar 10 minutos após o boot.

  3. Como você verifica o status de um timer e a próxima execução? Liste os comandos.

    ✓ Resposta:

    Use systemctl status nome.timer para ver detalhes, e systemctl list-timers para listar todos os timers ativos com próxima execução.

  4. O que significa Persistent=true em um timer? Por que é útil?

    ✓ Resposta:

    Com Persistent=true, se o sistema estava desligado no horário agendado, o timer executará a tarefa assim que o sistema for iniciado (na próxima ativação). Isso é útil para tarefas que devem ocorrer mesmo que o sistema esteja inativo no momento agendado.

  5. Escreva um comando para ativar e iniciar um timer chamado backup.timer.

    ✓ Resposta:
    sudo systemctl enable backup.timer
    sudo systemctl start backup.timer