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
-
Por que usar caminhos absolutos no cron?
- O cron não possui o mesmo PATH que seu shell
- Caminhos relativos podem falhar
-
Qual a diferença entre crontab de usuário e do sistema?
- Usuário:
crontab -e(arquivo em /var/spool/cron/) - Sistema:
/etc/crontabou/etc/cron.d/
- Usuário:
-
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 crontabman 5 crontab- Formato do arquivo crontabsystemctl --user list-timers- Ver timers do systemd- Guia do Cron no Ubuntu
Lab criado em: Dezembro 2024 - Testado no Ubuntu 24.04