backup em bash - scripts diversos.

Atualizado em: 23/09/2006



Sobre este documento

Rotinas e exemplos de script para backup em bash.

Criar arquivo com listagem de diretórios para backup

Procure dividir o backup em arquivos, pode ser por diretórios, tipo de arquivo ou outro critério que melhor lhe atende.

A linha de comando abaixo cria um arquivo com todos os diretório de /home, use seu editor preferido para ajustar ou excluir eventuais sub-diretórios, a primeira linha funciona no SUSE 10.1 e a segunda no CL10, o resultado pode ser diferente em sua instalação, deve ter um diretório por linha neste formato.

  /home/contabil
  /home/netlogon
  /home/vendas
  /home/zago

ls -ld /home/* | awk '{print $9}' > /tmp/dirhome.txt

ls -ld /home/* | awk '{print $8}' > /tmp/dirhome.txt

backup em diretório local com rodizio semanal

Script para backup diário de diretórios listados em arquivo especifico, com rodizio semanal, no momento da cópia apaga os arquivos correspondente ao dia da semana (semana anterior). Neste intervalo de tempo pode gravar em CD ou copiar para outro local via NFS, SSH, FTP ou outro meio.

Este script requer arquivo com a listagem do diretórios, neste tutorial tem tópico especifico com dicas para criar o arquivo dirhome.txt indicado no script.

Coloque seus comandos no inicio do script para montagem de HD, NFS ou troca de diretório local

Lembre de usar if para testar o resultado dos comandos, espaço em disco, verficação do banco de dados, usuários conectados e outras verificações.

Inclua comandos para salvar mensagens em arquivo

Coloque o script no crontab ou diretório desejado do cron, veja tutorial data.html

Uma maneira bem simples e prática, colocar o script dentro de /etc/cron.hourly e acrescentar no inicio do script esta rotina para testar a hora, assim o script é executado de hora em hora, quando a hora atual coindicir com a definida no (if), comparador do script, automaticamente executa o script, nas demais horas do dia sai fora sem executar os demais comandos, pode colocar varios scripts no diretório, assim pode executar varias rotidas de backup durante o dia, ajuste a condição hora para cada escript.

Exemplo de rotina para testar de hora em hora e executar o script as 22 horas, tem que ficar no inicio do script.

  HATUAL=$(date +%H)
  if [ "$HATUAL" -eq "22" ]; then
     echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt
  else
    exit 1
  fi

A seguir, exemplo de script com o rotina acima, todo dia às 22 horas faz copia no mesmo HD em /backup, na primeira tentativa de executar vai retornar erro pela falta do arquivo /backup/dirhome.txt que contém a lista de diretórios, altere no script ou crie o diretório e faça copia do arquivo.

  #!/bin/bash
  HATUAL=$(date +%H)
  if [ "$HATUAL" -eq "22" ]; then
     echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt
  else
    exit 1
  fi
  ls -d /backup
  if [ $? -ne 0 ];then
    mkdir -p /backup/{seg,ter,qua,qui,sex,sab,dom}
    if [ $? -ne 0 ];then
      echo " falha na tentativa de criar diretórios, requer poderes de root"
      exit 1
    fi
  fi
  if [ -f /backup/dirhome.txt ]; then
    #seus comandos aqui quando existir o arquivo.
    echo "tudo OK iniciando o backup."
  else
    #seus comandos aqui quando não existe o arquivo.
    echo "falta arquivo /backup/dirhome.txt  lista de diretorios para backup."
    echo "provicencie o arquivo ou correção no caminho do mesmo"
    exit 1
  fi
  MNUMDIA=$(echo `date +%u`)
  case $MNUMDIA in
   1) MDIA=seg ;;
   2) MDIA=ter ;;
   3) MDIA=qua ;;
   4) MDIA=qui ;;
   5) MDIA=sex ;;
   6) MDIA=sab ;;
   7) MDIA=dom ;;
  esac
  cd /backup/$MDIA
  rm -rf /backup/$MDIA/*
  while read LINHA ; do
    MDIR=`echo $LINHA | sed "s|/||g"`
    MMES=`date +'-%d-%b-%Y.tar.gz'`
    MARQUIVO=`echo $MDIR$MMES`
    /bin/tar czf $MARQUIVO $LINHA
    echo "retorno de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt
    echo `date`  >> /tmp/logbackup.txt
  done < /backup/dirhome.txt
  #  backup do resto do home, pegar eventuais diretórios novos.
  /bin/tar czf homeoutros-`date +%d%m%y`.tar.gz /home --exclude-from=/backup/dirhome.txt
  # backup do /tmp
  /bin/tar czf dirtemp-`date +%d%m%y`.tar.gz /tmp
  # remover arquivos com mais de 10 dias
  /bin/find /backup/ -name "*.tar.gz" -mtime +10 -exec rm {} \;
  # enviar por scp para outra maquina, requer ssh sem senha configurado
  /usr/bin/sudo -u zago /usr/bin/scp * zago@192.168.1.205:/home/copias/samba
  echo "status  scp  $? " >> /tmp/logbackup.txt
  # acrescente seus comandos para desligar,  limpar lixeira  e etc...

Download de script semelhante ao acima.
wget http://www.zago.eti.br/modelos/backhome.txt
Importar direto "vi" :r !lynx -dump http://www.zago.eti.br/modelos/backhome.txt

Outro modelo modificado para salvar em outro HD na maquina local /mnt/hd2, basta colocar o script no diretório /etc/cron.hourly, reiniciar o crond e prontinho, de hora em hora testa se são 22 horas, quando a hora for igual a 22 executa todo o script. Ainda falta alguns comandos sobre espaço em disco, enviar e-mail com o resultado e outros detalhes...
  #!/bin/bash
  HATUAL=$(date +%H)
  if [ "$HATUAL" -eq "22" ]; then
     echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt
  else
    exit 1
  fi
  ls -d /mnt/hd2/home
  if [ $? -ne 0 ];then
       mount /dev/hdc2 /mnt/hd2
    if [ $? -ne 0 ];then
      echo " falha na tentativa de montar /dev/hdc2, saindo sem fazer o backup"
      # coloque aqui as mensagens e arquivo que deseja salvar o aviso
      exit 1
    fi
  fi
  ls -d /mnt/hd2/backup
  if [ $? -ne 0 ];then
    mkdir -p /mnt/hd2/backup/{seg,ter,qua,qui,sex,sab,dom}
    if [ $? -ne 0 ];then
      echo " falha na tentativa de criar diretórios, requer poderes de root"
      exit 1
    fi
  fi
  if [ -f /mnt/hd2/backup/dirhome.txt ]; then
    #seus comandos aqui quando existir o arquivo.
    echo "tudo OK iniciando o backup."
  else
    #seus comandos aqui quando não existe o arquivo.
    echo "falta arquivo /mnt/hd2/backup/dirhome.txt  lista de diretorios para backup."
    echo "provicencie o arquivo ou correção no caminho do mesmo"
    exit 1
  fi
  MNUMDIA=$(echo `date +%u`)
  case $MNUMDIA in
   1) MDIA=seg ;;
   2) MDIA=ter ;;
   3) MDIA=qua ;;
   4) MDIA=qui ;;
   5) MDIA=sex ;;
   6) MDIA=sab ;;
   7) MDIA=dom ;;
  esac
  cd /mnt/hd2/backup/$MDIA
  # cuidado com rm a seguir, apaga tudo do diretório do dia do backup
  rm -rf /mnt/hd2/backup/$MDIA/*
  while read LINHA ; do
    MDIR=`echo $LINHA | sed "s|/||g"`
    MMES=`date +'-%d-%b-%Y.tar.gz'`
    MARQUIVO=`echo $MDIR$MMES`
    /bin/tar czf $MARQUIVO $LINHA
    echo "retorno de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt
    echo `date`  >> /tmp/logbackup.txt
  done < /mnt/hd2/backup/dirhome.txt
  /bin/tar czf homeoutros-`date +%d%m%y`.tar.gz /home --exclude-from=/backup/dirhome.txt
  /bin/tar czf dirtemp-`date +%d%m%y`.tar.gz /tmp
  cd /home
  umount /mnt/hd2
  # acrescente seus comandos para desligar,  limpar lixeira  e etc...

Pode simplificar as linhas de comando acima, estão expandidas para facilitar modificações e entendimento, em lugar do case para converter o dia da semana, pode usar esta linha de comando.

MDIA=$((LANG=pt_BR date '+%A')| cut -c0-3)

Cuidado que esta linha retorna sáb com acento em lugar de sab, portanto precisa ajustar a linha de criação do diretório.

Cuidado com esta linha em script executado no cron, pode pegar idioma diferente.

Indicações

programar para execução automatica via cron e crontab
http://www.zago.eti.br/agenda.html
Dicas sobre backup em geral.
http://www.zago.eti.br/script/backup-dicas.html

Página principal sobre script em geral (FAQ)
http://www.zago.eti.br/script/A-menu-scripts.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html