Automatizando tarefas repetitivas com cron e systemd timers
1. Introdução à automação de tarefas no Linux
Automatizar tarefas repetitivas no Linux é uma das práticas mais poderosas para administradores de sistemas e desenvolvedores. Ao delegar tarefas rotineiras a ferramentas de agendamento, você reduz drasticamente a chance de erros manuais e libera tempo para atividades mais estratégicas. As duas principais ferramentas para esse fim no ecossistema Linux são o cron, presente desde os primórdios do Unix, e os systemd timers, introduzidos como parte do sistema de init moderno.
A escolha entre cron e systemd timers depende do cenário: o cron oferece simplicidade e portabilidade, funcionando em praticamente qualquer distribuição Linux. Já os systemd timers fornecem flexibilidade superior, com controle granular sobre dependências, logs integrados e monitoramento via journalctl. Este artigo explora ambas as ferramentas com exemplos práticos, ajudando você a decidir qual usar em cada situação.
2. Fundamentos do cron: sintaxe e arquivos de configuração
O cron utiliza o arquivo crontab para definir tarefas. A sintaxe básica é composta por cinco campos que especificam minuto, hora, dia do mês, mês e dia da semana, seguidos pelo comando a ser executado:
# Formato: minuto hora dia mes dia_semana comando
0 3 * * * /usr/bin/backup.sh
Para editar seu crontab pessoal, use crontab -e. Para listar as tarefas ativas, use crontab -l. Exemplos práticos incluem:
-
Backup diário às 2h da manhã:
text 0 2 * * * /home/usuario/scripts/backup.sh -
Limpeza de logs a cada hora:
text 0 * * * * /usr/local/bin/clean_logs.sh -
Envio de relatório semanal às 8h de segunda-feira:
text 0 8 * * 1 /home/usuario/scripts/enviar_relatorio.sh
3. Boas práticas e armadilhas comuns no cron
Um dos erros mais frequentes ao usar cron é ignorar o ambiente reduzido em que os comandos são executados. Por padrão, o cron não carrega variáveis de ambiente como PATH ou HOME. Para evitar falhas, defina-as explicitamente no início do crontab:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/home/usuario
0 3 * * * /home/usuario/scripts/backup.sh >> /var/log/backup.log 2>&1
O redirecionamento de saída é crucial para depuração. Sem ele, mensagens de erro são enviadas por e-mail ao proprietário do crontab (se o MTA estiver configurado). Sempre use caminhos absolutos nos comandos e scripts, e lembre-se de que o cron não ajusta automaticamente para horário de verão — tarefas agendadas para horários ambíguos podem ser executadas duas vezes ou nenhuma.
4. Introdução aos systemd timers: estrutura e vantagens
Os systemd timers são units do systemd que disparam serviços em momentos específicos. Diferentemente do cron, eles exigem dois arquivos pareados: um .timer (que define o agendamento) e um .service (que define o que executar). As vantagens incluem:
- Dependências: um timer pode esperar que outro serviço termine antes de iniciar.
- Logging integrado: toda saída é capturada pelo
journald. - Monitoramento:
systemctl list-timersmostra status, próxima execução e última execução. - Random delays: evita picos de carga ao atrasar aleatoriamente a execução.
5. Criando e gerenciando timers no systemd
Vamos criar um timer para executar um script de backup toda madrugada às 3h. Primeiro, o arquivo de serviço /etc/systemd/system/backup.service:
[Unit]
Description=Backup diário
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Agora, o arquivo timer /etc/systemd/system/backup.timer:
[Unit]
Description=Timer para backup diário
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Ative e inicie o timer:
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer
Para verificar o status:
systemctl list-timers --all
O campo Persistent=true garante que, se o sistema estava desligado no horário agendado, o serviço será executado na próxima inicialização.
Outros agendamentos úteis:
- Executar 5 minutos após o boot:
OnBootSec=5min - Executar 1 hora após a última execução:
OnUnitActiveSec=1h - Executar em horário específico com random delay:
OnCalendar=*-*-* 03:00:00combinado comRandomizedDelaySec=30min
6. Comparação avançada: cron vs. systemd timers no dia a dia
Quando usar cron:
- Simplicidade máxima: um único arquivo para editar.
- Portabilidade: funciona em ambientes sem systemd (ex: containers mínimos, BSD).
- Tarefas simples sem dependências complexas.
Quando usar systemd timers:
- Tarefas que dependem de outros serviços (ex: backup após montagem de disco).
- Necessidade de logs centralizados e monitoramento via journalctl.
- Quando você já gerencia serviços com systemd e quer consistência.
- Para evitar execuções simultâneas com RandomizedDelaySec.
Migrando do cron para systemd timers:
Suponha que você tenha este crontab:
0 4 * * * /usr/bin/atualizar_cache.sh
Crie o service /etc/systemd/system/atualizar-cache.service:
[Unit]
Description=Atualizar cache do sistema
[Service]
Type=oneshot
ExecStart=/usr/bin/atualizar_cache.sh
E o timer /etc/systemd/system/atualizar-cache.timer:
[Unit]
Description=Timer para atualizar cache
[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=10min
[Install]
WantedBy=timers.target
Ative e remova a linha do crontab.
7. Monitoramento e depuração de tarefas automatizadas
Para cron:
- Logs ficam em /var/log/syslog (Debian/Ubuntu) ou /var/log/cron (RHEL/CentOS).
- Filtre com: grep CRON /var/log/syslog
- Verifique e-mail local com mail (se configurado).
Para systemd timers:
- Use journalctl -u backup.service para ver a saída do serviço.
- Use journalctl -u backup.timer para ver eventos do timer.
- Teste manualmente: systemctl start backup.service
Sempre valide scripts manualmente antes de agendar. Crie um ambiente de teste com timers que executam a cada minuto (OnCalendar=*:0/1) para depuração rápida.
8. Conclusão e próximos passos
Tanto cron quanto systemd timers são ferramentas essenciais para automação no Linux. O cron é ideal para tarefas simples e ambientes legados, enquanto os systemd timers oferecem controle e integração superiores em sistemas modernos. Comece com o cron se você precisa de algo rápido e portátil; migre para timers quando precisar de dependências, logs robustos ou monitoramento avançado.
Para expandir, combine timers com scripts em Shell, Python ou Bash. Considere também ferramentas como anacron para tarefas que devem rodar mesmo se o sistema ficar desligado por períodos, ou at para execução única. A automação bem feita transforma tarefas repetitivas em processos confiáveis e invisíveis.
Referências
- Documentação oficial do cron (man page) — Página de manual completa do cron, incluindo sintaxe e opções.
- Documentação do systemd timer (man page) — Especificação detalhada dos arquivos .timer do systemd.
- Guia prático de systemd timers no DigitalOcean — Tutorial abrangente sobre units do systemd, incluindo timers.
- Cron vs systemd timers: comparação no LinuxConfig — Artigo comparativo com exemplos de migração entre as duas ferramentas.
- Usando systemd timers para automação (Red Hat) — Guia oficial da Red Hat sobre configuração e gerenciamento de timers.
- Tutorial de cron no Linux (Linuxize) — Guia passo a passo para iniciantes em cron, com exemplos práticos.