systemd timers (visão geral)
Esta aula apresenta uma visão geral dos systemd timers, uma alternativa moderna ao cron para agendamento de tarefas no Linux. Você aprenderá as diferenças entre eles, as units básicas envolvidas, quando usar timers, e verá exemplos práticos de criação e gerenciamento.
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=truese a tarefa deve ser executada mesmo se o sistema estava desligado no horário. - Use
RandomizedDelaySecpara evitar picos de carga quando muitos timers disparam ao mesmo tempo. - Monitore seus timers com
systemctl list-timerse verifique os logs comjournalctl -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
- Documentação oficial do systemd.timer
- Documentação de especificação de tempo do systemd
- Arch Wiki - Systemd/Timers
- DigitalOcean - Como usar systemd timers como alternativa ao cron
- Opensource.com - Agendando tarefas com systemd timers
- man page do systemctl
Exercícios
-
Crie um timer que execute um serviço chamado
meu-servico.servicetodos 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 -
Qual é a diferença entre
OnCalendareOnBootSec? Dê um exemplo de uso para cada.✓ Resposta:OnCalendardefine um agendamento baseado em calendário (como 'todas as segundas às 3h').OnBootSecdefine um tempo relativo após a inicialização do sistema (ex.: '5min'). Exemplo:OnCalendar=Mon..Fri 03:00:00para dias úteis às 3h;OnBootSec=10minpara executar 10 minutos após o boot. -
Como você verifica o status de um timer e a próxima execução? Liste os comandos.
✓ Resposta:Use
systemctl status nome.timerpara ver detalhes, esystemctl list-timerspara listar todos os timers ativos com próxima execução. -
O que significa
Persistent=trueem 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. -
Escreva um comando para ativar e iniciar um timer chamado
backup.timer.✓ Resposta:sudo systemctl enable backup.timer sudo systemctl start backup.timer