Pular para o conteúdo principal

Lab 6.4 - Cron e Crontab

Objetivos do Lab​

Ao final deste lab, você será capaz de:

  • Compreender o sistema cron
  • Criar tarefas agendadas com crontab
  • Gerenciar crontabs de usuário e do sistema
  • Monitorar a execução de tarefas cron
  • Resolver problemas comuns
  • Utilizar systemd timers (alternativa moderna)

Duração Estimada​

45-60 minutos

Pré-requisitos​

  • Ubuntu 24.04 instalado e funcional
  • Acesso de usuário com sudo
  • Terminal aberto
  • Conhecimentos básicos de linha de comando

Exercício 1: Introdução ao Cron​

Etapa 1: Verificar o Serviço Cron​

# Verificar se cron está instalado e ativo
systemctl status cron

# Se não estiver instalado (normalmente já vem por padrão)
sudo apt update
sudo apt install cron

# Iniciar e habilitar
sudo systemctl enable cron
sudo systemctl start cron

Etapa 2: Entender a Estrutura​

# Ver crontabs do sistema
ls -la /etc/cron.*

# Ver crontabs de usuário
ls -la /var/spool/cron/crontabs/

# Ver o crontab do usuário atual
crontab -l

Exercício 2: Crontab de Usuário​

Etapa 1: Editar o Crontab​

# Editar o crontab do usuário atual
crontab -e

# Na primeira vez, escolha um editor (nano recomendado)

Etapa 2: Sintaxe do Crontab​

Formato: minuto hora dia mês dia-semana comando

# Exemplos de sintaxe:
# * * * * * = A cada minuto
# 0 * * * * = A cada hora (minuto 0)
# 0 0 * * * = Todos os dias à meia-noite
# 0 0 * * 0 = Todos os domingos à meia-noite
# */5 * * * * = A cada 5 minutos

Etapa 3: Criar uma Tarefa Simples​

# Criar um script de teste
cat > ~/test-cron.sh << 'EOF'
#!/bin/bash
echo "Cron executado em $(date)" >> ~/cron-test.log
EOF

chmod +x ~/test-cron.sh

# Adicionar ao crontab (executar a cada minuto para teste)
crontab -e
# Adicione esta linha:
# * * * * * /home/$USER/test-cron.sh

# Ver o crontab
crontab -l

# Aguarde 2-3 minutos, depois verifique
cat ~/cron-test.log

Exercício 3: Tarefas Comuns​

Etapa 1: Backup Diário​

# Criar um script de backup
cat > ~/backup-daily.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="$HOME/backups"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" ~/Documents 2>/dev/null
echo "Backup criado: backup-$DATE.tar.gz"
EOF

chmod +x ~/backup-daily.sh

# Adicionar ao crontab (todos os dias às 2h da manhã)
crontab -e
# Adicione:
# 0 2 * * * /home/$USER/backup-daily.sh >> /home/$USER/backup.log 2>&1

Etapa 2: Limpeza Semanal​

# Script de limpeza
cat > ~/cleanup-weekly.sh << 'EOF'
#!/bin/bash
# Remover arquivos temporários > 7 dias
find ~/tmp -type f -mtime +7 -delete 2>/dev/null
# Limpar logs antigos
find ~/logs -name "*.log" -mtime +30 -delete 2>/dev/null
echo "Limpeza realizada: $(date)"
EOF

chmod +x ~/cleanup-weekly.sh

# Adicionar ao crontab (todos os domingos às 3h)
crontab -e
# Adicione:
# 0 3 * * 0 /home/$USER/cleanup-weekly.sh

Etapa 3: Monitoramento de Sistema​

# Script de monitoramento
cat > ~/monitor-system.sh << 'EOF'
#!/bin/bash
LOG="$HOME/system-monitor.log"
{
echo "=== $(date) ==="
echo "CPU: $(top -bn1 | grep 'Cpu(s)' | awk '{print $2}')"
echo "Memória: $(free -h | grep Mem | awk '{print $3"/"$2}')"
echo "Disco: $(df -h / | tail -1 | awk '{print $5}')"
echo "---"
} >> "$LOG"
EOF

chmod +x ~/monitor-system.sh

# Executar a cada 5 minutos
crontab -e
# Adicione:
# */5 * * * * /home/$USER/monitor-system.sh

Exercício 4: Variáveis de Ambiente​

Etapa 1: Configurar o Ambiente​

# O crontab não tem o mesmo ambiente que seu shell
# É necessário definir as variáveis necessárias

crontab -e
# Adicione no topo do arquivo:
# PATH=/usr/bin:/bin
# SHELL=/bin/bash
# HOME=/home/$USER
# MAILTO=seu-email@example.com

# Exemplo com PATH definido
# */5 * * * * /usr/bin/curl http://example.com >> /tmp/curl.log 2>&1

Etapa 2: Caminhos Absolutos​

# Sempre use caminhos absolutos no cron
# ❌ Ruim:
# * * * * * script.sh

# ✅ Bom:
# * * * * * /home/$USER/script.sh

# Ou defina no script:
# #!/bin/bash
# cd /home/$USER
# ./script.sh

Exercício 5: Crontab do Sistema​

Etapa 1: Crontab do Sistema​

# Editar o crontab do sistema
sudo crontab -e

# Ou criar um arquivo em /etc/cron.d/
sudo nano /etc/cron.d/minha-tarefa

# Formato com usuário:
# * * * * * usuario /caminho/para/script.sh

# Exemplo: backup do sistema todos os dias à 1h
# 0 1 * * * root /usr/local/bin/system-backup.sh

Etapa 2: Diretórios Cron do Sistema​

# /etc/cron.daily/ - Execução diária
ls -la /etc/cron.daily/

# /etc/cron.weekly/ - Execução semanal
ls -la /etc/cron.weekly/

# /etc/cron.monthly/ - Execução mensal
ls -la /etc/cron.monthly/

# /etc/cron.hourly/ - Execução horária
ls -la /etc/cron.hourly/

# Criar um script em cron.daily
sudo nano /etc/cron.daily/meu-script
# Adicione:
#!/bin/bash
# Seu script aqui

# Tornar executável
sudo chmod +x /etc/cron.daily/meu-script

Exercício 6: Monitoramento e Logs​

Etapa 1: Ver os Logs do Cron​

# Ubuntu 24.04 usa systemd, os logs estão no journalctl
sudo journalctl -u cron

# Ver as últimas entradas
sudo journalctl -u cron -n 50

# Acompanhar em tempo real
sudo journalctl -u cron -f

# Filtrar por usuário
sudo journalctl -u cron | grep $USER

# Ver execuções de hoje
sudo journalctl -u cron --since today

Etapa 2: Verificar a Execução​

# Script para verificar se o cron executou uma tarefa
cat > ~/check-cron.sh << 'EOF'
#!/bin/bash
SCRIPT="$HOME/test-cron.sh"
LOG="$HOME/cron-test.log"

# Verificar última execução
if [ -f "$LOG" ]; then
LAST_RUN=$(tail -1 "$LOG" | awk '{print $4, $5}')
echo "Última execução: $LAST_RUN"
else
echo "Nenhuma execução encontrada"
fi

# Verificar nos logs do sistema
echo "Logs do sistema:"
sudo journalctl -u cron | grep "$SCRIPT" | tail -5
EOF

chmod +x ~/check-cron.sh
./check-cron.sh

Exercício 7: Solução de Problemas​

Etapa 1: Problemas Comuns​

# Problema: Script não executa
# Solução 1: Verificar permissões
chmod +x ~/meu-script.sh

# Solução 2: Verificar caminhos
which comando-no-script

# Solução 3: Testar manualmente
bash ~/meu-script.sh

# Solução 4: Verificar logs
sudo journalctl -u cron | tail -20

Etapa 2: Debug​

# Adicionar logging no script
cat > ~/script-debug.sh << 'EOF'
#!/bin/bash
set -x # Modo debug
exec > /tmp/script-debug.log 2>&1
echo "Início: $(date)"
# Seu código aqui
echo "Fim: $(date)"
EOF

# No crontab, redirecione também
# * * * * * /home/$USER/script-debug.sh >> /tmp/cron-debug.log 2>&1

Exercício 8: systemd Timers (Alternativa Moderna)​

Etapa 1: Criar um Timer​

# Criar um serviço
cat > ~/.config/systemd/user/backup.service << 'EOF'
[Unit]
Description=Backup diário

[Service]
Type=oneshot
ExecStart=/home/$USER/backup-daily.sh
EOF

# Criar um timer
cat > ~/.config/systemd/user/backup.timer << 'EOF'
[Unit]
Description=Timer para backup diário

[Timer]
OnCalendar=daily
OnCalendar=02:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

# Recarregar e ativar
systemctl --user daemon-reload
systemctl --user enable backup.timer
systemctl --user start backup.timer

# Verificar
systemctl --user list-timers

Verificação​

Checklist​

Verifique se você consegue:

  • Editar um crontab de usuário
  • Entender a sintaxe do cron
  • Criar tarefas agendadas
  • Configurar variáveis de ambiente
  • Ver os logs do cron
  • Solucionar problemas comuns
  • Utilizar systemd timers (opcional)

Perguntas para Reflexão​

  1. Por que usar caminhos absolutos no cron?

    • O cron não possui o mesmo PATH que seu shell
    • Caminhos relativos podem falhar
  2. Qual a diferença entre crontab de usuário e do sistema?

    • Usuário: crontab -e (arquivo em /var/spool/cron/)
    • Sistema: /etc/crontab ou /etc/cron.d/
  3. Quando usar systemd timers vs cron?

    • systemd timers: Mais moderno, melhor integração
    • cron: Mais simples, suportado universalmente

Próximos Passos​

  • Capítulo 8.3: Cron Avançado e systemd Timers
  • Módulo 11: Monitoramento de Crons e Alertas
  • Módulo 12: Automação Completa

Recursos Ubuntu 24.04​

  • man crontab - Documentação do crontab
  • man 5 crontab - Formato do arquivo crontab
  • systemctl --user list-timers - Ver timers do systemd
  • Guia do Cron no Ubuntu

Lab criado em: Dezembro 2024 - Testado no Ubuntu 24.04