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-timers mostra 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:00 combinado com RandomizedDelaySec=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