IFCE Horizonte · Portal
ADS23 · Sistemas Operacionais

Mão na massa · ~51 min

Backup que funciona, restauração que prova — e sua equipe definida

Hoje você constrói um script de backup completo, testa restaurar de verdade, agenda a execução automática, e fecha a aula com equipe formada e serviço escolhido para o projeto final.

Passos 1–4 · Backup, restauração e cronPasso 5 · Projeto final: equipe e planejamento

🚀 Hoje começa o projeto final

O que você construir neste roteiro pode ser aproveitado diretamente no toolkit do projeto — o backup.sh do passo 1 já é um dos três scripts obrigatórios da entrega.

Leia o Enunciado do Projeto Integrador — Etapa 2 ainda esta semana. É leitura obrigatória.

Passo 1 de 5

Um script de backup de verdade

Backup útil tem quatro características: identifica a data, compacta, grava em local separado, e registra o que fez.
1nano ~/backup.sh

O que é

tar -czf empacota e compacta um diretório inteiro num arquivo só. O nome inclui a data via $(date +%F), técnica do Encontro 13.

Por que importa

Sem data no nome, cada backup sobrescreve o anterior — e você fica com uma cópia só, provavelmente já corrompida junto com o original.

#!/bin/bash

ORIGEM=~/dados_importantes
DESTINO=~/backups
LOG=~/backup.log
DATA=$(date +%F_%H-%M)

log() {
echo "[$(date +'%F %T')] $1" | tee -a "$LOG"
}

mkdir -p "$DESTINO"

if [ ! -d "$ORIGEM" ]; then
log "ERRO: origem $ORIGEM não existe"
exit 1
fi

ARQUIVO="$DESTINO/backup_${DATA}.tar.gz"
tar -czf "$ARQUIVO" -C "$(dirname "$ORIGEM")" "$(basename "$ORIGEM")"

if [ $? -eq 0 ]; then
TAMANHO=$(du -h "$ARQUIVO" | cut -f1)
log "OK: backup criado em $ARQUIVO ($TAMANHO)"
exit 0
else
log "ERRO: falha ao criar o backup"
exit 1
fi
O que esperar:

antes de rodar, crie a origem com mkdir -p ~/dados_importantes && echo "conteudo valioso" > ~/dados_importantes/arquivo1.txt. Depois chmod +x ~/backup.sh e execute. Confira o resultado com ls -lh ~/backups.

O que faz o if [ ! -d "$ORIGEM" ]?

O ! nega o teste: "se o diretório não existir". É uma verificação defensiva — sem ela, o script tentaria compactar algo inexistente e criaria um backup vazio, dando a falsa impressão de que funcionou. Verificar antes de agir é o requisito nº 6 do enunciado do projeto.

Por que o -C e o dirname/basename no tar?

Sem isso, o tar guardaria o caminho completo (home/aluno/dados_importantes/...) dentro do pacote, e a restauração recriaria toda essa árvore. Com -C, ele entra no diretório-pai antes de empacotar, guardando só dados_importantes/ — bem mais fácil de restaurar em qualquer lugar.

Passo 2 de 5

A prova real: restaurar

Este é o passo mais importante do roteiro. Backup que nunca foi restaurado não é backup — e a única forma de saber é testando.
2Apague o original e recupere do backup

O que é

Simula o desastre: o dado original some, e você precisa recuperá-lo apenas com o que guardou.

Por que importa

É o único teste que responde "eu tenho backup?". Sem ele, você tem um arquivo compactado de utilidade desconhecida.

$ cat ~/dados_importantes/arquivo1.txt
conteudo valioso
$ rm -rf ~/dados_importantes
$ ls ~/dados_importantes
ls: não foi possível acessar: Arquivo ou diretório inexistente
$ ULTIMO=$(ls -t ~/backups/backup_*.tar.gz | head -1)
$ tar -xzf "$ULTIMO" -C ~/
$ cat ~/dados_importantes/arquivo1.txt
conteudo valioso
O que esperar:

o conteúdo volta exatamente como estava. Se não voltar, seu backup tem um problema — e é muito melhor descobrir isso agora, num diretório de teste, do que em produção.

Por que o ULTIMO=$(ls -t ... | head -1)?

Se você rodou o backup mais de uma vez, backup_*.tar.gz casa com vários arquivos. O tar -xzf trataria o segundo nome como algo a procurar dentro do primeiro, e falharia com um erro confuso. O ls -t ordena do mais novo para o mais antigo e o head -1 fica só com o mais recente — que é o que se restaura num incidente.

Estou com medo de apagar algo importante

Você está apagando apenas ~/dados_importantes, criado por você no passo 1 exatamente para este teste. Nenhum arquivo pessoal seu está envolvido. Confirme o caminho antes de rodar o rm -rf — e note que essa checagem é exatamente o hábito que o Encontro 12 ensinou.

por que testar a restauração é considerado parte essencial do backup, e não um passo opcional? O que seu teste revelou?

0 / 40 caracteres

Passo 3 de 5

Fazendo rodar sozinho

Um backup que depende de você lembrar não é confiável. O cron executa nos horários que você definir.
3crontab -e

O que é

Abre seu arquivo de agendamentos. Cada linha tem cinco campos de tempo (minuto, hora, dia do mês, mês, dia da semana) seguidos do comando.

Por que importa

É o que transforma um script em automação de verdade — ele passa a rodar mesmo com você desconectado.

# para o teste de hoje: a cada 2 minutos
*/2 * * * * /home/SEU_USUARIO/backup.sh

# em produção seria algo como: todo dia às 3h
# 0 3 * * * /home/SEU_USUARIO/backup.sh
O que esperar:

use */2 hoje para não esperar até de madrugada. Troque SEU_USUARIO pelo seu nome de usuário real — descubra com whoami. Salve e confirme com crontab -l.

Por que caminho absoluto?

O cron roda num ambiente reduzido, bem diferente do seu terminal: o PATH tem só alguns diretórios, o seu .bashrc não é carregado, e o diretório de trabalho é a sua pasta pessoal — não a pasta onde o script está. Um caminho relativo passa a apontar para outro lugar, e um comando fora do PATH reduzido não é encontrado. Sempre use caminhos absolutos no cron e dentro dos scripts agendados. É a origem do erro nº 1 de quem começa a agendar tarefas: "funciona no terminal mas não no cron".

Cuidado com o % na linha do crontab

No crontab, o % tem significado especial (quebra de linha). Uma linha como 0 3 * * * tar -czf /backups/b_$(date +%F).tar.gz ... não funciona. Deixe o date dentro do script, como no backup.sh, ou escreva \% na linha do crontab.

Passo 4 de 5

Confirmando que executou

Aguarde alguns minutos e verifique se o cron realmente rodou o script — sem olhar, você só tem a expectativa de que rodou.
4tail -f ~/backup.log

O que é

tail -f acompanha o arquivo ao vivo, mostrando novas linhas conforme são gravadas (comando do Encontro 12).

Por que importa

É a diferença entre "acho que está rodando" e "sei que rodou às 14h22". Automação sem log é automação sem evidência.

$ tail -f ~/backup.log
[2026-11-13 14:20:01] OK: backup criado em /home/aluno/backups/backup_2026-11-13_14-20.tar.gz (4,0K)
[2026-11-13 14:22:01] OK: backup criado em /home/aluno/backups/backup_2026-11-13_14-22.tar.gz (4,0K)
O que esperar:

uma nova linha a cada 2 minutos, sem você fazer nada. Saia com Ctrl+C. Confira também ls -lh ~/backups — vários arquivos, um por execução, cada um com sua data no nome.

O log não recebeu nenhuma linha nova

Verifique nesta ordem: (1) o caminho no crontab está absoluto e correto? (2) o script tem chmod +x? (3) o serviço cron está ativo (systemctl status cron)? (4) rodou o script manualmente e funcionou? (5) o cron tentou rodar? Veja com grep CRON /var/log/syslog | tail. Se funciona manualmente mas não pelo cron, a causa quase sempre é o ambiente reduzido: caminho relativo ou comando fora do PATH dentro do script.

O que esperar:

Importante ao terminar: remova o agendamento de teste com crontab -e (apague a linha), senão seu disco vai acumular backups a cada 2 minutos indefinidamente.

por que um script que funciona no terminal pode falhar quando roda pelo cron? Cite duas diferenças do ambiente do cron e como você se protegeu delas.

0 / 40 caracteres

Projeto final · equipe e planejamento

Passo 5 de 5

Definindo a equipe e o serviço

Reserve os últimos minutos da aula para isto. Sair hoje com equipe formada e serviço escolhido é o que garante três encontros úteis de trabalho.
5Combinem em equipe e registrem

O que decidir hoje

Composição da equipe, qual serviço será operado, e quem fica responsável por cada um dos três scripts.

Por que agora

Restam só três encontros até a entrega. Equipe indefinida hoje significa uma semana perdida.

# Registrem em um arquivo, para trazer no próximo encontro:

EQUIPE: __________________________________
SERVIÇO ESCOLHIDO: _______________________
(sugestão segura: nginx servindo páginas estáticas)

RESPONSÁVEIS:
deploy.sh   → _________________________
backup.sh   → _________________________
monitor.sh  → _________________________
README      → _________________________

O QUE VAMOS GUARDAR EM BACKUP: ___________
O QUE VAMOS MONITORAR (3 métricas): ______
O que esperar:

Recomendação forte: escolham um serviço simples. O mérito do trabalho está na qualidade do toolkit, não na complexidade do serviço — isso está explícito na seção 2 do enunciado. Um nginx com três páginas e um toolkit sólido vale mais do que algo sofisticado e inacabado.

Não sabemos que serviço escolher

Vão de nginx servindo páginas HTML estáticas. É rápido de subir, tem dado óbvio para backup (as páginas e a configuração), e estado claro para monitorar (o container está no ar? responde?). Vocês já sabem tudo que precisam para isso desde o Encontro 4.

qual serviço sua equipe escolheu operar, e por quê? O que vocês pretendem guardar em backup e monitorar?

0 / 40 caracteres

Exemplo de observação forte × fraca

Observação fraca

"Testei restaurar e funcionou."

Observação forte

"Apaguei ~/dados_importantes por completo e restaurei só a partir do .tar.gz — o conteúdo voltou idêntico. O teste importa porque, sem ele, eu teria um arquivo compactado de utilidade desconhecida: poderia estar vazio, com caminho errado ou corrompido, e eu só descobriria no momento em que precisasse de verdade. Na primeira tentativa o tar recriou a árvore home/aluno/ inteira dentro do destino, o que só percebi porque testei — foi por isso que passei a usar o -C."

Checklist final

  • Escrevi o backup.sh com log, data no nome e verificação de origem
  • Testei restaurar apagando o original e recuperando do backup
  • Agendei o script no cron com caminho absoluto
  • Confirmei no log que o cron executou sozinho
  • Removi o agendamento de teste do crontab
  • Minha equipe está formada e o serviço escolhido
  • Dividimos as responsabilidades dos três scripts
  • Li o Enunciado do Projeto Integrador — Etapa 2
  • Preenchi as 3 observações acima (vou colar no quiz semanal)
0 / 9 verificados