Script de Backup utilizando ZIP

Iniciado por apache_am, 28 de Junho de 2006, 14:15

tópico anterior - próximo tópico

apache_am

Achei um script de backup na internet bem simples, ele monta o hd externo se não tiver montado e depois compacta os arquivos de um diretório informado e seus subdiretórios.
O problema: Se eu rodar o script no terminal, ele roda normalmente, copiando todas as pastas e subpastas, mas se eu colocar para ser chamado pelo CRON, ele começa a copiar e depois de poucos segundos para, sem deixar nenhuma mensagem.
Gostaria de saber se alguém tem algum script parecido funcionando ou se tem alguma solução para o meu problema.
Fico no aguardo, valeu.

clcampos

Para saber o que esta acontecendo com seu script só tendo acesso ao mesmo. Falo isto, porque o tratamento de variáveis (se ele tiver sido desenvolvido em shell script) quando se esta trabalhando em segundo plano (batch) é um pouco diferente.

Caso você queira, desenvolvi (usando shell script) um pequeno "sisteminha" de backup, que controla catálogos, e pode fazer backup em outro hd, fita dat (que é a default) ou então em cd-rom.

Este sistema ainda esta longe de ter seu desenvolvimento terminado... esta totalmente usável (afinal ele é usado todos os dias onde trabalho) mas tem muito ainda pra desenvolver, baseado no projeto inicial que tenho em mente. Mas estou sempre mexendo nele.

Cristiano
clcampos@gmail.com
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

apache_am

Cristiano,

Coloquei meu problema no tópico script pelo fato de estar tentando automatizar uma linha de comando.
Meu "SCRIPT" nada mais é que um "tar", ou seja, faço a copactação em um diretório e todos os seus subdiretórios para um arquivo que é colocado em um HD usb externo tendo como nome do arquivo a data e a hora do sistema. Veja abaixo:

DATA=`date +%Y-%m-%d-%H.%M`
tar -zcvf /media/usbdisk/backupmc-"$DATA".tar.gz /home/millennium/


Se eu executar manualmente, ele roda sem problema, agora se eu colocá-lo na pasta "/etc/cron.daily/", e programar um horário para ocorrer, ele começa e para logo em seguida.

Se você puder postar o código do seu script eu te agradeço. Caso você não queira postar, mande para o meu e-mail apache_am@hotmail.com.

O que eu modificar ou acrescentar, te mando também.

Obrigado pela ajuda.

Atenciosamente,

Rodrigo Lima

clcampos

Cara nenhuma das minhas rotinas estão ainda prepraradas para trabalhar em batch (usando o cron).

Antes de continuar deixa só fazer duas colocações:

- Não tem problema em postar meus códigos e os colocarei no final do texto;
- Te adicionei no hotmail. O meu é cristiano_lc@msn.com. É sempre bom ter pessoas pra gente poder trocar ideias.

Mas vamos la... deixa eu tentar explicar o porque meu código ainda não ta pronto para ser rodado em batch, e talvez vc até ache o porque de o seu código não estar funcionando. Quando você coloca algo em bacth a primeira coisa que ele faz é tentar subsituir as variáveis, assim coisas como:

- DATA=`date +%Y-%m-%d-%H.%M`   #execução de comandos entre ``
- DATA=$XXXX  #a variável $XXXX deixa de existir, ficando seu conteudo no lugar, isto se existir algum conteudo
- etc.

Então quando  se deseja que as variáveis ou os comandos a executar entre `` sejam executados apenas durante a execução normal da rotina (seja em bacth ou não) vc deve preceder seu uso com um \. Então ficaria (seguindo os exemplos anteriores:

- DATA=\`date +%Y-%m-%d-%H.%M\`
- DATA=\$XXXX

E isto pode parecer besteira, mas após anos (e bota anos nisto) trabalhando com shell te digo que isto da o maior problema, sem contar que deve-se ter muita atenção no seu uso!!!

Espero ter explicado o porque de que meus códigos não rodarem em batch ainda. E por falar neles vou colocá-los a partir daqui:

Obs.:

- Não observe o código assim tão de perto (hehe) ele tem muito o que melhorar, por exemplo com uso de case ao invés do if, em muitos casos....
- crie na pasta onde estiverem as rotinas um arquivo com nome databackup
- a maioria das alterações a serem feitas para que as rotinas passem a funcionar na sua maquina (devido a diferenças de pastas, etc) estão em variáveis de ambiente no inicio das rotinas.
- as rotinas postadas aqui podem ser baixadas de: http://repositorio.interlegis.gov.br/utilidades/AdministracaoServidores/
- além delas existem outras tantas lá, e elas estão em constante mudança, já que estão muito longe de estar onde eu pretendo chegar com elas, mas estão completamente funcionais (as mudanças a serem feitas são principalmente em relação a interface, facilidade de alteração - vou criar um rotinas.conf e permitir a troca centralizada la de variáveis comuns, como pasta de executção entre outros - e outras consentradas nas rotinas de backup, mas que seria complicado explicar aqui)

BEM COMO A MENSAGEM FICOU MAIOR QUE O PERMITIDO VOU POSTAR OS SCRIPTS EM MENSAGENS SEPARADAS
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos

mnSeg - Menu para chamar as rotinas


#!/bin/sh

# Menu para chamar as rotinas ligadas a segurança (backup, restore, e findfile)
#
# Desenvolvida por: Cristiano Lage Campos
# Em              : 02/12/2005
#

PASTA_ROTINAS="/backup/backup"

while true;do
      clear

      echo
      echo -e "\033[1m-----------------------------------------------------------\033[0m"
      echo -e "\033[1m| Bem vindo a rotina de segurança do servidor de arquivos |\033[0m"
      echo -e "\033[1m-----------------------------------------------------------\033[0m"
      echo
      echo -e "\033[1m              Escolha uma das opções abaixo\033[0m"
      echo
      echo -e "\033[1m              1\033[0m - Realização de Backup"
      echo -e "\033[1m              2\033[0m - Localização de arquivos em Backup´s"
      echo -e "\033[1m              3\033[0m - Restauração de Backup´s"
      echo -e "\033[1m              4\033[0m - Remove Catálogo"
      echo
      echo -e "\033[1m              9\033[0m - Encerra"
      echo
      echo -e "              Escolha sua opção - \c"
      read OPCAO

      if test "$OPCAO" = "1";then
         $PASTA_ROTINAS/backup
      elif test "$OPCAO" = "2";then
           $PASTA_ROTINAS/findfile
      elif test "$OPCAO" = "3";then
           $PASTA_ROTINAS/restore
      elif test "$OPCAO" = "4";then
           $PASTA_ROTINAS/rmdirb
      elif test "$OPCAO" = "9";then
           echo
           echo -e "mnSeg: rotina encerrada pelo usuário."
           echo
           break
      elif test "$OPCAO" = "fim" -o "$OPCAO" = "Fim" -o "$OPCAO" = "FIM"; then
           echo
           echo -e "mnSeg: rotina encerrada pelo usuário."
           echo
           break
      else
           echo
           echo -e "mnSeg: Opção inválida!"
           echo
      fi
done


backup - Rotina de backup para cdrom, outro hd  e fita dat (default)


#!/bin/sh

#Rotina de backup
#Cristiano Lage Campos
#
# Criado em 2005
#
# Ultima alteração: Chamar a rotina de exclusão de catálogos chamando com o parametro (tipo do backup) para lista apenas os backups daquele tipo
# Alterado em: 23/05/2006
#

DSEM=`date '+%a'`
TBACK="diario"
V_DRIVE="16"                           #Velocidade do drive de gravação
DATA_BACK=`date '+%Y%m%d'`
DIR_DEST=`date '+%Y%m%d_%H%M'`
DIR_BACK="/backup/backup"            #Diretorio de execução do backup
DIR_BACKA="/backup/backup/arquivos"  #Diretorio para copiar os arquivos
DIR_BACKL="/backup/backup/lista"     #Diretorio com a lista dos arq copiados
SH_DTBACK="/backup/backup/backup.cd" #Shell usado no backup diario
LOCAL_GRAV="dat"                     #Local de gravação "cd" ou "hd"

if test "$DSEM" = "Seg"; then
   DMES=`date '+%d'`
   if test $DMES -lt 8; then
      TBACK="mensal"       #Guarda o tipo do backup a ser realizado
   else
      TBACK="semanal"
   fi
else
   TBACK="diario"
fi

RESP="n"

while test "$RESP" = "n"; do
      echo -e "Backup a ser realizado será <<$TBACK>>. Confirma (s/n)? \c"
      read RESP

      test "$RESP" = "fim" && exit

      if test "$RESP" != "s" -a "$RESP" != "S";  then
         while true; do
               echo ""
               echo "Informe então a forma de backup"
               echo ""
               echo -e "\033[1m1\033[0m - Diário"
               echo -e "\033[1m2\033[0m - Semanal"
               echo -e "\033[1m3\033[0m - Mensal"
               echo ""
               echo -e "Informe a opção - \c"
               read OP

               if test "$OP" = "1"; then
                  TBACK="diario"
                  break
               elif test "$OP" = "2"; then
                    TBACK="semanal"
                    break
               elif test "$OP" = "3"; then
                    TBACK="mensal"
                    break
               elif test "$OP" = "fim"; then
                    exit
               else
                    echo
                    echo "Opção inválida."
                    echo
               fi
         done
      fi
done

RESP="n"

while test "$RESP" = "n"; do
      echo -e "Backup <<$TBACK>> realizado em <<$LOCAL_GRAV>>. Confirma (s/n)? \c"
      read RESP

      test "$RESP" = "fim" && exit

      if test "$RESP" != "s" -a "$RESP" != "S";  then
         while true; do
               echo ""
               echo "Informe então o local do backup"
               echo ""
               echo -e "\033[1m0\033[0m - Fita DAT"
               echo -e "\033[1m1\033[0m - CD"
               echo -e "\033[1m2\033[0m - Local (HD)"
               echo ""
               echo -e "Informe a opção - \c"
               read OP

               if test "$OP" = "0"; then
                    LOCAL_GRAV="dat"          #Local de gravação "DAT"
                    break
               elif test "$OP" = "1"; then
                    LOCAL_GRAV="cd"           #Local de gravação "CD"
                    break
               elif test "$OP" = "2"; then
                    LOCAL_GRAV="hd"           #Local de gravação "HD"
                    break
               elif test "$OP" = "fim"; then
                    exit
               else
                    echo
                    echo "Opção inválida."
                    echo
               fi
         done
      fi
done


if test "$TBACK" = "diario"; then   #Opções Backup Diário
   #------------------------------------------------------
   # Shell cria arquivo que serve como parametro de data
   # para o backup diário
   #------------------------------------------------------
   sh $SH_DTBACK
   ARQ_BACK="$DIR_BACK/databackup" #para mudar esta linha tem que mudar
                                   #também no shell backup.cd
   #----------------------------------------------------

   #DIR_INI="/home/usuarios /home/grupos"
   DIR_INI=" /home "                     #PASTA CENTRAL A REALIZAR BACKUP
   OPCOES=" -newer $ARQ_BACK -type f "   #OPÇÕES DO COMANDO cpio
elif test "$TBACK" = "mensal"; then      #Opções Backup Mensal
     DIR_INI=" /home /etc "
     OPCOES=" -type f "
else                                     #Opções Backup Semanal
      DIR_INI=" /home "
      OPCOES=" -type f "
fi

echo
echo "Criando Pastas"
echo
mkdir $DIR_BACKA/$DIR_DEST\_$TBACK\_$LOCAL_GRAV
mkdir $DIR_BACKL/$DIR_DEST\_$TBACK\_$LOCAL_GRAV

echo "Gerando Lista de arquivos a copiar"
echo
#echo "find $DIR_INI $OPCOES -print -exec gzip {} \;"
#find $DIR_INI $OPCOES -print | cpio -ovN $DIR_BACKA/$DIR_DEST
#find $DIR_BACKA/$DIR_DEST -print > $DIR_BACKL/Lista_back_$TBACK
find $DIR_INI $OPCOES -print | grep -v /home/usuarios/root | grep -v /home/zopeuser | grep -v /home/usuarios/rcs | grep -v /home/Plugins | grep -v /home/deletados | grep -v /home/atendimento | grep -v /home/publico | grep -v /home/casa | grep -v /home/teste | grep -v /home/usuarios/cristiano/Zope | grep -v /home/usuarios/cristiano/Musicas | grep -v ".avi" | grep -v ".AVI" | grep -v ".mp3" | grep -v ".MP3" | grep -v ".wma" | grep -v ".WMA" | grep -v ".WVA" | grep -v ".wva"| grep -v ".jpg" | grep -v ".JPG" | grep -v ".bmp" | grep -v ".BMP" | grep -v ".gif" | grep -v ".GIF" | grep -v /home/publico | grep -v "/Conectiva" | grep -v "/Dados de Aplicativos" | grep -v "Favoritos" | grep -v "Menu Iniciar" | grep -v "/UserData" | grep -v "/.kde" | grep -v "/.mozilla" | grep -v "/.gnome" | grep -v "/.java" | grep -v "/.fonts" | grep -v "/.gimp" | grep -v "/.thumbnails" | grep -v "/.macromedia" | grep -v "/.kaffeine" | grep -v "/.xine" | grep -v "/.mplayer" | grep -v "/.kde" | grep -v "/.gnupg" | grep -v "/.qt" | grep -v "/.mcop" | grep -v "/Cookies" | grep -v "/Dados de aplicativos" | grep -v "/Favoritos" | grep -v "/Menu Iniciar" | grep -v "/UserData" | grep -v "/Python" | grep -v "/.config" | grep -v "/.wine" | grep -v "/.gaim" | grep -v "/Ambiente de rede" | grep -v "/Ambiente de impress" | grep -v "/.netscape" | grep -v "/.local" | grep -v "/egroupware" | grep -v "/.jpi" | grep -v "/.icons" | grep -v "/.anjuta" | grep -v "/.fullcircle" | grep -v "/.cddb" | grep -v "/.AbiSuite" | grep -v "/Skype" | grep -v "/.screenrc" | grep -v "/.alias" | grep -v "/.cshrc" | grep -v "/.bash" | grep -v "/.X" | grep -v "/.x" | grep -v "/tmp" | grep -v "/.mime" | grep -v "/.ICE" | grep -v "/.mailcap" | grep -v ".directory" | grep -v "/.DCOP" | grep -v "/.esd" | grep -v "/.ntuser" | grep -v "/Minhas Figuras" | grep -v "/.nfs" | grep -v "/Modelos" | grep -v "/Recent" | grep -v "/.dmrc" | grep -v "/.sversionrc" | grep -v "/ntuser" | grep -v "/.lpoptions" > $DIR_BACKL/$DIR_DEST\_$TBACK\_$LOCAL_GRAV/Lista_back_$TBACK

if test "$LOCAL_GRAV" = "dat"; then
   echo "Copiando arquivos para a FITA DAT"

#   tar -czv -T $DIR_BACKL/$DIR_DEST\_$TBACK/Lista_back_$TBACK -f /dev/st0
   cpio -ovcB < $DIR_BACKL/$DIR_DEST\_$TBACK\_$LOCAL_GRAV/Lista_back_$TBACK > /dev/st0
else
   echo "Copiando arquivos"
   echo
   cpio -pduvm $DIR_BACKA/$DIR_DEST\_$TBACK\_$LOCAL_GRAV < $DIR_BACKL/$DIR_DEST\_$TBACK\_$LOCAL_GRAV/Lista_back_$TBACK

   echo
   echo "Compactando arquivos"
   echo
   find $DIR_BACKA/$DIR_DEST\_$TBACK\_$LOCAL_GRAV -type f -exec gzip {} \;

   if test "$LOCAL_GRAV" = "cd"; then
      #Renomeando pastas
      #
      #Recurso usado para gravar mais de um backup no mesmo cd
      cd $DIR_BACKA
      PRIM_LOOP="s"
      for dir in `ls $DIR_DEST\_$TBACK\_$LOCAL_GRAV`
      do
          if test "$PRIM_LOOP" = "s";then                      #no primeiro passo do for crio a pasta
             PRIM_LOOP="n"                                     #com a data do dia onde as demais serão   
             mkdir $DIR_DEST\_$TBACK\_$LOCAL_GRAV/$DATA_BACK   #copiadas. Não faço isto fora pq senão
          fi                                                   #esta pasta tbem entraria no for       

          mv $DIR_DEST\_$TBACK\_$LOCAL_GRAV/$dir $DIR_DEST\_$TBACK\_$LOCAL_GRAV/$DATA_BACK/$dir
      done
      # -----------------------------
      #  NÃO  GRAVA  MULTI  VOLUMES
      #  no  comando diz  que grava
      #  mas não esta gravando, não
      #  sei pq.
      # -----------------------------
      echo
      echo "Criando Imagem"
      cd $DIR_BACKA
      mkisofs -r -o $DIR_DEST.iso $DIR_DEST\_$TBACK\_$LOCAL_GRAV

      echo
      echo "Gravando Backup"
      #O Parametro da opção dev foi colhido com o comando
      #cdrecord -scanbus, onde 0,0,0 é o cdrom e 0,1,0 cdrw
      #
      #para realizar a gravação deve ser alterado o /etc/rc.local
      #colocando no final a seguinte linha
      #
      # modprobe sg ; modprobe ide-scsi
      #
      #Esta linha faz com que o sistema operacional carrega o modulo
      #SCSI emulando as unidades de cd como scsi
      #
      cdrecord -v speed=$V_DRIVE dev=0,1,0 -data -multi -eject $DIR_DEST.iso

      echo
      echo "Removendo arquivos temporarios"
      rm -rf $DIR_DEST\_$TBACK\_$LOCAL_GRAV   #pasta com os arquivos
      rm -rf $DIR_DEST.iso                    #arquivo iso gerado para a gravação do backup em cd
   fi
fi

RESP="n"

while test "$RESP" = "n"; do
      echo -e "Deseja remover algum catálogo (s/n)? \c"
      read RESP

      test "$RESP" = "fim" -o "$RESP" = "FIM" -o "$RESP" = "Fim" && exit

      if test "$RESP" = "s" -o "$RESP" = "S";  then
         sh $DIR_BACK/rmdirb $TBACK

         break
      elif test "$RESP" = "n" -o "$RESP" = "N";  then
           break
      else
           echo -e "\033[1mResposta incorreta.\033[0m"
           RESP="n"
      fi
done

echo
echo -e "\033[1m------------------------------------------------------------------------\033[0m"
echo -e "\033[1m| Backup encerrado!  Tecle <\033[0mENTRA\033[1m> para retornar ao Menu.|\033[0m"
echo -e "\033[1m------------------------------------------------------------------------\033[0m"
echo
read ESPERA

Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos

backup.cd - Rotina auxiliar à rotina de backup


#!/bin/sh

#Rotina de Controle de data do arquivo databackup
#Este arquivo é usado no backup diário e sua unica função
#é servir de parametro para o find na hora de buscar os arquivos
#alterados apenas do dia anterior pra frente
#
#Cristiano Lage Campos
#
#20ago2004
#

#------------------------------------------------------
ARQ_BACK="/backup/backup/databackup" #para mudar esta linha tem que mudar
                                     #também a mesma linha no shell backup

DIA=`date +'%d'`
DIA=`expr $DIA - 1`

MES=`date +'%m'`

ANO=`date +'%Y'`

HOR="0000"

if test `expr $DIA : '.*'` -eq 1; then
        DIA="0"$DIA
fi

if test "$DIA" = "00" -o "$DIA" = "0"; then
   DIA="01"
   MES=`expr $MES - 1`

   if test `expr $MES : '.*'` -eq 1; then
      MES="0"$MES
   fi
fi   

if test "$MES" = "00" -o "$MES" = "0"; then
   MES="01"
   ANO=`expr $ANO - 1`
fi

date > $ARQ_BACK
touch -t $ANO$MES$DIA$HOR $ARQ_BACK
#----------------------------------------------------
# Término da rotina descrita acima
#----------------------------------------------------


findfile - Rotina para procura de arquivo "backupeado" nos catálogos


#!/bin/sh

#Rotina para localização nos catálogos de possíveis arquivos perdidos
#
# Desenvolvida por: Cristiano Lage Campos
# Em              : 02/12/2005
#

PADRAO=$1
DIR_LISTA="/backup/backup/lista"
DIR_BACKA="/backup/backup"

#
# Solicita o padrão para procura nos catálogos
#
while test "$PADRAO" = ""; do
      echo -e "Informe um padrão de nome de arquivo para pesquisa: \c"
      read PADRAO

      if test "$PADRAO" = "FIM" -o "$PADRAO" = "Fim" -o "$PADRAO" = "fim"; then
         echo
         echo -e "findfile: \033[1mEncerrado pelo usuário.\033[0m"
         echo
         exit
      fi
done

DISTINGUE=""    #Pra saber se o grep distingue ou não entre maiúsculas e minusculas
OPSN=""

#
# Questiona preocupação de distinção entre maiusculas e minusculas nas buscas dos catálogos
#
while test "$OPSN" = ""; do
      echo
      echo -e "Deseja que a busca \033[1mNÃO\033[0m faça distinção entre maiúsculas e minúsculas (s/n)? \c"
      read OPSN

      if test "$OPSN" = "FIM" -o "$OPSN" = "Fim" -o "$OPSN" = "fim"; then
         echo
         echo -e "findfile: \033[1mEncerrado pelo usuário.\033[0m"
         echo
         exit
      fi

      if test "$OPSN" != "S" -a "$OPSN" != "s" -a "$OPSN" != "N" -a "$OPSN" != "n";then
         echo
         echo -e "findfile: \033[1m Opção Inválida!.\033[0m"
         echo
         OPSN=""
      fi

      if test "$OPSN" = "S" -o "$OPSN" = "s";then
         DISTINGUE=" -i "
      fi
done

OPSN=""

#
# Tipo do Relatório
#                       1: Normal
#                       2: Detalhado
#
while test "$OPSN" = ""; do
      echo
      echo -e "Digite \033[1m1\033[0m para gerar relatório normal ou \033[1m2\033[0m para gerar relatório detalhado: \c"
      read OPSN

      if test "$OPSN" = "FIM" -o "$OPSN" = "Fim" -o "$OPSN" = "fim"; then
         echo
         echo -e "findfile: \033[1mEncerrado pelo usuário.\033[0m"
         echo
         exit
      fi

      if test "$OPSN" != "1" -a "$OPSN" != "2";then
         echo
         echo -e "findfile: \033[1m Opção Inválida!.\033[0m"
         echo
         OPSN=""
      fi

      TIPO_REL=$OPSN
done


echo
APRES=""    #Variável para apresentação da busca de padrão nos catalogos

#
# Tipo de apresentação do relatório
#                                        1: Gerar na tela
#                                        2: Gerar em arquivo (no final o mesmo pode ser exibido)
#
while test "$APRES" = ""; do
      echo
      echo -e "Informe (\033[1m1\033[0m) para apresentação na tela e (\033[1m2\033[0m) para gerar arquivo: \c"
      read APRES

      if test "$APRES" = "FIM" -o "$APRES" = "Fim" -o "$APRES" = "fim"; then
         echo
         echo -e "findfile: \033[1mEncerrado pelo usuário.\033[0m"
         echo
         exit
      fi

      if test "$APRES" != "1" -a "$APRES" != "2";then
         echo
         echo -e "findfile: \033[1m Opção Inválida!.\033[0m"
         echo
         APRES=""
      fi
done

FILE_SAVE=""

#
# Para relatório apresentado em arquivo, cria (ou limpa caso exista) o repositório que receberá a busca
#
if test $APRES -eq 2;then
   FILE_SAVE="$DIR_BACKA/Resultado_Pesquisa"
   echo
   echo "-------------------"
   echo "| Criando Arquivo |"
   echo "-------------------"
   echo "Relação de Backups que tem arquivos que coincidem com o padrão." > $FILE_SAVE
   echo "" >> $FILE_SAVE
fi

#
#
echo
echo
echo "---------------------------------------------"
echo "| Realizando pesquisa para padrão informado |"
echo "---------------------------------------------"
echo
echo

cd $DIR_LISTA

#
# Verifica em quais backups o padrão se encontra
#
for backups in `ls`; do
    cd $DIR_LISTA/$backups

    set `cat * | grep $DISTINGUE "$PADRAO";echo "<"` 2> /dev/null

    if test "$1" != "<"; then
       LISTA_BACKUPS="$LISTA_BACKUPS $backups"
    fi

    shift $#
done

Lista_Diario=""
Lista_Mensal=""
Lista_Semanal=""

#
# Separa em listas diferentes os backups quanto ao seu tipo (Diário, Semanal, e Mensal)
#
for lista in $LISTA_BACKUPS; do
    Tipo_Backup=`echo $lista | cut -c15-20`

    if test "$Tipo_Backup" = "diario"; then
       Lista_Diario="$Lista_Diario $lista"
    elif test "$Tipo_Backup" = "mensal"; then
         Lista_Mensal="$Lista_Mensal $lista"
    else #Aqui é semanal
         Lista_Semanal="$Lista_Semanal $lista"
    fi

done

#
# Gera lista de backups para o tipo DIARIO
#
if test "$Lista_Diario" != ""; then
   echo

   if test $APRES -eq 2;then
      echo "Padrão encontrado para backups DIÁRIO" >> $FILE_SAVE
   else
      echo -e "Padrão encontrado para backups \033[1mDIÁRIO\033[0m"
   fi

   for lista in $Lista_Diario;do
       FIM=`expr $lista : $lista`     #acha o nro de caracteres da pasta
       INI=`expr $FIM - 2`

       DIA=`echo $lista | cut -c7-8`
       MES=`echo $lista | cut -c5-6`
       ANO=`echo $lista | cut -c1-4`
       HORA=`echo $lista | cut -c10-11`
       MINUTO=`echo $lista | cut -c12-13`

       Tipo_Backup=`echo $lista | cut -c$INI-$FIM`

       if test "$Tipo_Backup" = "dat";then
          Tipo_Backup="Fita Dat"
       elif test "$Tipo_Backup" = "_hd";then
            Tipo_Backup="Disco Rigido"
       elif test "$Tipo_Backup" = "_cd";then
            Tipo_Backup="CD-ROM"
       else
            Tipo_Backup="Mídia não determinada"
       fi

       if test $APRES -eq 2;then #Gerar em arquivo
          Montagem="Data: $DIA/$MES/$ANO - Horário: $HORA:$MINUTO - Mídia: $Tipo_Backup - $lista"

          echo "$Montagem" >> $FILE_SAVE
       else
          Montagem="Data: \033[1m$DIA/$MES/$ANO\033[0m - Horário: \033[1m$HORA:$MINUTO\033[0m - Mídia: \033[1m$Tipo_Backup\033[0m - $lista"

          echo -e "$Montagem"
       fi

       if test "$TIPO_REL" = "2"; then  #Listagem Detalhada
          $DIR_BACKA/findfile_DETALHE $lista $PADRAO $APRES $DISTINGUE
       fi
   done
fi

#
# Gera lista de backups para o tipo SEMANAL
#
if test "$Lista_Semanal" != ""; then
   echo

   if test $APRES -eq 2;then
      echo "" >> $FILE_SAVE
      echo "Padrão encontrado para backups SEMANAL" >> $FILE_SAVE
   else
      echo -e "Padrão encontrado para backups \033[1mSEMANAL\033[0m"
   fi

   for lista in $Lista_Semanal;do
       FIM=`expr $lista : $lista`     #acha o nro de caracteres da pasta
       INI=`expr $FIM - 2`

       DIA=`echo $lista | cut -c7-8`
       MES=`echo $lista | cut -c5-6`
       ANO=`echo $lista | cut -c1-4`
       HORA=`echo $lista | cut -c10-11`
       MINUTO=`echo $lista | cut -c12-13`

       Tipo_Backup=`echo $lista | cut -c$INI-$FIM`

       if test "$Tipo_Backup" = "dat";then
          Tipo_Backup="Fita Dat"
       elif test "$Tipo_Backup" = "_hd";then
            Tipo_Backup="Disco Rigido"
       elif test "$Tipo_Backup" = "_cd";then
            Tipo_Backup="CD-ROM"
       else
            Tipo_Backup="Mídia não determinada"
       fi

       if test $APRES -eq 2;then #Gerar em arquivo
          Montagem="Data: $DIA/$MES/$ANO - Horário: $HORA:$MINUTO - Mídia: $Tipo_Backup - $lista"

          echo "$Montagem" >> $FILE_SAVE
       else
          Montagem="Data: \033[1m$DIA/$MES/$ANO\033[0m - Horário: \033[1m$HORA:$MINUTO\033[0m - Mídia: \033[1m$Tipo_Backup\033[0m - $lista"

          echo -e "$Montagem"
       fi

       if test "$TIPO_REL" = "2"; then  #Listagem Detalhada
          $DIR_BACKA/findfile_DETALHE $lista $PADRAO $APRES $DISTINGUE
       fi
   done
fi

#
# Gera lista de backups para o tipo MENSAL
#
if test "$Lista_Mensal" != ""; then
   echo

   if test $APRES -eq 2;then
      echo "" >> $FILE_SAVE
      echo "Padrão encontrado para backups MENSAL" >> $FILE_SAVE
   else
      echo -e "Padrão encontrado para backups \033[1mMENSAL\033[0m"
   fi

   for lista in $Lista_Mensal;do
       FIM=`expr $lista : $lista`     #acha o nro de caracteres da pasta
       INI=`expr $FIM - 2`

       DIA=`echo $lista | cut -c7-8`
       MES=`echo $lista | cut -c5-6`
       ANO=`echo $lista | cut -c1-4`
       HORA=`echo $lista | cut -c10-11`
       MINUTO=`echo $lista | cut -c12-13`

       Tipo_Backup=`echo $lista | cut -c$INI-$FIM`

       if test "$Tipo_Backup" = "dat";then
          Tipo_Backup="Fita Dat"
       elif test "$Tipo_Backup" = "_hd";then
            Tipo_Backup="Disco Rigido"
       elif test "$Tipo_Backup" = "_cd";then
            Tipo_Backup="CD-ROM"
       else
            Tipo_Backup="Mídia não determinada"
       fi

       if test $APRES -eq 2;then #Gerar em arquivo
          Montagem="Data: $DIA/$MES/$ANO - Horário: $HORA:$MINUTO - Mídia: $Tipo_Backup - $lista"

          echo "$Montagem" >> $FILE_SAVE
       else
          Montagem="Data: \033[1m$DIA/$MES/$ANO\033[0m - Horário: \033[1m$HORA:$MINUTO\033[0m - Mídia: \033[1m$Tipo_Backup\033[0m - $lista"

          echo -e "$Montagem"
       fi

       if test "$TIPO_REL" = "2"; then  #Listagem Detalhada
          $DIR_BACKA/findfile_DETALHE $lista $PADRAO $APRES $DISTINGUE
       fi
   done
fi

#
# No caso de gerar a busca em arquivo pergunta se quer apresentá-lo
#
if test $APRES -eq 2;then
   echo
   echo -e "\033[1mResultado da busca em $DIR_BACKA/Resultado_Pesquisa. Deseja visualizar? \c\033[0m"
   read OPSN

   if test "$OPSN" = "FIM" -o "$OPSN" = "Fim" -o "$OPSN" = "fim"; then
      echo
      echo -e "findfile: \033[1mEncerrado pelo usuário.\033[0m"
      echo
      exit
   fi

   if test "$OPSN" = "S" -o "$OPSN" = "s"; then
      pg $DIR_BACKA/Resultado_Pesquisa
   fi

fi

echo
echo -e "\033[1m---------------------------------------------------------\033[0m"
echo -e "\033[1m| Busca encerrada!  Tecle <\033[0mENTRA\033[1m> para retornar ao Menu.|\033[0m"
echo -e "\033[1m---------------------------------------------------------\033[0m"
echo
read ESPERA

Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos


findfile_DETALHE - Rotina auxiliar à findfile


#!/bin/sh

#Rotina para detalhar a localização nos catálogos de possíveis arquivos perdidos
#
# Desenvolvida por: Cristiano Lage Campos
# Em              : 23/05/2006
#
#
# A Rotina recebe (apenas através de linha de comando) três Parametros que são....
#
#        Pasta do Catálogo
#        Padrão de pesquisa
#        Tipo de Apresentação (que pode ser:
#                                            1: Gerar na Tela
#                                            2: Gerar em arquivo)
#        Se faz distinção entre maiusculas e minusculas ou não


PASTA=$1
PADRAO=$2
APRES=$3
DISTINGUE=$4

DIR_LISTA="/backup/backup/lista"
DIR_BACKA="/backup/backup"
FILE_SAVE="$DIR_BACKA/Resultado_Pesquisa"

cd $DIR_LISTA/$PASTA

for arqs in `cat * | grep $DISTINGUE "$PADRAO"`; do
    #
    #Para juntar arquivos com espaço dentro do nome
    #
    PRIM_LETRA=`echo $arqs | cut -c1-1`

    if test "$PRIM_LETRA" = "/"; then
       COM="\n"
       ESP="     "
    else
       COM=""
       ESP=" "
    fi

    if test "$APRES" = "1"; then
       echo -e "$COM$ESP$arqs\c"
    else
       echo -e "$COM$ESP$arqs\c" >> $FILE_SAVE
    fi
done

if test "$APRES" = "1"; then
   echo -e "\n"
else
   echo -e "\n" >> $FILE_SAVE
fi


restore - Rotina de recuperação de arquivos em fita dat


#!/bin/sh

#Rotina para restauração de backup
#
# Desenvolvida por: Cristiano Lage Campos
# Em              : 02/12/2005
#

echo
echo -e "\033[1m---------------------------------------------------------\033[0m"
echo -e "\033[1m| Rotina usada apenas para backup realizado em fita DAT |\033[0m"
echo -e "\033[1m---------------------------------------------------------\033[0m"
echo

ARQ=$1
DIR_LISTA="/backup/backup/lista"

while test "$ARQ" = ""; do
      echo -e "Informe o nome do arquivo (com percurso) para restaurar: \c"
      read ARQ

      if test "$ARQ" = "FIM" -o "$ARQ" = "Fim" -o "$ARQ" = "fim"; then
         echo
         echo -e "restore: \033[1mEncerrado pelo usuário.\033[0m"
         echo
         exit
      fi
done

#nmARQ=`echo $ARQ | expr //$ARQ : ´.<F3>/\(.*)´`

#Tipo_Restore=""
#while test "$Tipo_Restore" = ""; do
#      echo
#      echo -e "\033[1m1\033[0m - Restauração de arquivo no local original"
#      echo -e "\033[1m2\033[0m - Restauração de arquivo em outro local"
#      echo
#      echo -e "Informe a opção desejada: \c"
#      read Tipo_Restore
#
#      if test "$Tipo_Restore" = "FIM" -o "$Tipo_Restore" = "Fim" -o "$Tipo_Restore" = "fim"; then
#         echo
#         echo -e "restore: \033[1mEncerrado pelo usuário.\033[0m"
#         echo
#         exit
#      fi
#done

#if test "$Tipo_Restore" = "2"; then
#else
#fi

echo
echo -e "\033[1m--------------------------------------------\033[0m"
echo -e "\033[1m| Insira a fita na unidade e tecle <ENTER> |\033[0m"
echo -e "\033[1m--------------------------------------------\033[0m"
echo
read ESPERA

echo "$ARQ" > $DIR_LISTA/remova-me

echo
echo -e "\033[1m-------------------------\033[0m"
echo -e "\033[1m| Iniciando RESTAURAÇÃO |\033[0m"
echo -e "\033[1m-------------------------\033[0m"
echo

cpio -ivBcdm -E $DIR_LISTA/remova-me < /dev/st0

rm -rf $DIR_LISTA/remova-me

echo
echo -e "\033[1m-------------------------------------------------------------------------\033[0m"
echo -e "\033[1m| Restore encerrado!  Tecle <\033[0mENTRA\033[1m> para retornar ao Menu.|\033[0m"
echo -e "\033[1m-------------------------------------------------------------------------\033[0m"
echo
read ESPERA


rndirb - Rotina para remoção de catálogos (Uma das esperadas alterações que desejo fazer é tornar a execução dessa rotina totalmente transparente ao usuário. Analise já feita, faltando apenas a implementação)


#!/bin/sh
# Remove catálogos de backup´s (Remove apenas catálogos de backup´s realizados em FITA DAT
#
# Criado por: Cristiano
#
# Criado em: Sei la (rs)
# Alterado em : 23/05/2006 - Listar apenas as rotinas relativas ao backup atual (mensal, semanal, etc....)


PASTA_BACK="/backup/backup"
PASTA_ARQU="/backup/backup/arquivos"
PASTA_LIST="/backup/backup/lista"
TIPO_BACK=$1 #todos: Todos ///  diario: Diário /// semanal: Semanal /// mensal: Mensal
DIR=$2
COMANDO1=""
COMANDO2=""

if test "$DIR" = ""; then
   echo
   echo -e "----------------------------------"
   echo -e "| \033[1mLista de Catálogos encontrados\033[0m |"
   echo -e "----------------------------------"
   echo

   RESP="n"

   while test "$RESP" = "n"; do
         if test "$TIPO_BACK" != "todos" -a "$TIPO_BACK" != "diario" -a "$TIPO_BACK" != "semanal" -a "$TIPO_BACK" != "mensal"; then
            echo -e "Escolha uma opção dentre as listadas:"
            echo
            echo -e "\033[1m1\033[0m - Todos"
            echo -e "\033[1m2\033[0m - Diário"
            echo -e "\033[1m3\033[0m - Semanal"
            echo -e "\033[1m4\033[0m - Mensal"
            echo
            echo -e "Digite a opção desejada - \c"
            read RESP
         else
            case $TIPO_BACK
            in
                 todos)   RESP="1"
                          ;;
                 diario)  RESP="2"
                          ;;
                 semanal) RESP="3"
                          ;;
                 mensal)  RESP="4"
                          ;;
            esac
         fi

         test "$RESP" = "fim" -o "$RESP" = "FIM" -o "$RESP" = "Fim" && exit

         if test "$RESP" = "1"; then
              LISTAR=\*"_dat"
         elif test "$RESP" = "2"; then
              LISTAR=\*"_diario_dat"
         elif test "$RESP" = "3"; then
              LISTAR=\*"_semanal_dat"
         elif test "$RESP" = "4"; then
              LISTAR=\*"_mensal_dat"
         else
              echo -e "\033[1mOpção Inválida.\033[0m"
              RESP="n"
         fi
   done

   CONTADOR=0
   cd $PASTA_ARQU

   ls -d $LISTAR 2> /dev/null > /dev/null

   if test $? -eq 0;then
      for BACKUPS in `ls -d $LISTAR`; do
          CONTADOR=`expr $CONTADOR + 1`
          if test $CONTADOR -gt 9;then
             echo -e "\033[1m$CONTADOR\033[0m       $BACKUPS"
          else
             echo -e "\033[1m $CONTADOR\033[0m       $BACKUPS"
          fi
      done
   else
      echo -e "\033[1m\nNão existem catálogos a remover.\033[0m"
      exit
   fi

   OP_N=""
   while test ! "$OP_N";do
         echo
         echo -e "Informe o nro. do catálogo a deletar: \c"
         read OP_N

         test "$OP_N" = "Fim" -o "$OP_N" = "FIM" -o "$OP_N" = "fim" && exit
         test ! "$OP_N" && OP_N="0"

         if test $OP_N -lt 1 -o $OP_N -gt $CONTADOR; then
            OP_N=""
            echo
            echo -e "rmdirb: Opção inválida!"
            echo
         fi
   done

   CONTADOR=0
   for BACKUPS in `ls -d $LISTAR`; do
       CONTADOR=`expr $CONTADOR + 1`
       if test $CONTADOR -eq $OP_N;then
          DIR=$BACKUPS
       fi
   done

fi

#echo "Opção escolhida: $OP_N - $DIR"
#exit

if test "$PASTA_ARQU/$DIR" = "$PASTA_ARQU/";then
   echo -e "\n\n\n\n\033[1mErro Grave na Rotina de Remoção de Catálogos. Contate Administrador.\033[0m\n\n\n\n"
   read espera
   exit 9999
fi

if test ! -d $PASTA_ARQU/$DIR; then
   echo "$0: Diretório inexistente em $PASTA_ARQU."
   exit
else
   COMANDO1="rm -rf $PASTA_ARQU/$DIR"
fi

if test ! -d $PASTA_LIST/$DIR; then
   echo "$0: Diretório inexistente em $PASTA_LIST. Tecle \"continua\" para remover os arquivos:"
   read CONF
   if test "$CONF" != "continua"; then
      exit
   fi
else
   COMANDO2="rm -rf $PASTA_LIST/$DIR"
fi

$COMANDO1
$COMANDO2

echo -e "----------------------------------------------------------"
echo -e "| \033[1mrmdirb:\033[0m Fim de Execução. Tecle <\033[1mENTER\033[0m> para continuar. |"
echo -e "----------------------------------------------------------"
read ESPERA


Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

rafasnn

Pessoal,

aproveitando o tópico, estou desenvolvendo um script para backup do servidor, mas acho que fiz algo errado, quando chega a hora de executar o script no crontab gera um arquivo temporário com nomes estranhos tipo "ziF0a7Hl", acho fiz errei no crontab, se alguém ai achar a falha...

script

#!/bin/bash
#
# BACKUP
#
#
# Rafael Navas Neto  rafasnnlinux@uol.com.br
#
# 14/09/2007

DATA=`date +%d%m%y-%H%M`
zip -r /home/"$DATA"-dct_almoxarifado /home/dct_almoxarifado


crontab -e

GNU nano 1.3.10        File: /tmp/crontab.3GlVvk/crontab                     

# m h  dom mon dow   commad
35 23 * * * /home/backup.sh


vlw
Macbook Pro 2,33 4GB 250GB
iPhone 8GB

rafasnn

Macbook Pro 2,33 4GB 250GB
iPhone 8GB

rafasnn

clcampos,

você que é um Dino nos scripts da uma luz ai, pq o script acima não zipa as pastas ?  ;D
Macbook Pro 2,33 4GB 250GB
iPhone 8GB

clcampos

Citação de: rafasnn online 20 de Setembro de 2007, 09:46
clcampos,

você que é um Dino nos scripts da uma luz ai, pq o script acima não zipa as pastas ?  ;D

Você tem permissão para gravar na pasta /home?

Você tem permissão de ler /home/dct_almoxarifado?
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

rafasnn

Citação de: rafasnn online 14 de Setembro de 2007, 23:50
crontab -e

GNU nano 1.3.10        File: /tmp/crontab.3GlVvk/crontab                     

# m h  dom mon dow   commad
35 23 * * * /home/backup.sh


vlw

o script backup.sh está na pata home e o mesmo está no crontab, as instruções no crontab não são executadas pelo root?
Macbook Pro 2,33 4GB 250GB
iPhone 8GB

clcampos

Citação de: rafasnn online 20 de Setembro de 2007, 10:20
o script backup.sh está na pata home e o mesmo está no crontab, as instruções no crontab não são executadas pelo root?

Digamos que eu não use o crontab a algum tempo, portanto cabe uma pesquisa antes e o que irei falar não é necessariamente exato, mas acho que o crontab irá executar a rotina com as mesmas permissões do usuário que criou o agendamento, não?

Já experimentou rodar o comando com o usuário normalmente, apenas para ver se funciona?

Mude sua rotina (conforme abaixo) apenas para teste:

#!/bin/bash
#
# BACKUP
#
#
# Rafael Navas Neto  rafasnnlinux@uol.com.br
#
# 14/09/2007

echo "DATA=`date +%d%m%y-%H%M`" > TesteBesta
echo "zip -r /home/"$DATA"-dct_almoxarifado /home/dct_almoxarifado" >> TesteBesta


Depois olha o que tem dentro do arquivo TesteBesta, quem sabe não dá uma luz do que realmente esta acontecendo.

obs.: Rode a rotina como esta aqui usando o cron.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

rafasnn

clcampos,

não funciona nem assim.
#!/bin/bash
#
# BACKUP
#
#
# Rafael Navas Neto  rafasnnlinux@uol.com.br
#
# 14/09/2007

echo "DATA=`date +%d%m%y-%H%M`" > TesteBesta
echo "zip -r /home/"$DATA"-dct_almoxarifado /home/dct_almoxarifado" >> TesteBesta


agora quando altero o crontab ele grava o arquivo teste blz na pasta home, acho que o problema está em executar o .sh no crontab


GNU nano 1.3.10        File: /tmp/crontab.3GlVvk/crontab                     

# m h  dom mon dow   commad
52 14 * * * root echo "teste" > teste
Macbook Pro 2,33 4GB 250GB
iPhone 8GB

clcampos

Mas qual é o conteúdo do arquivo?
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!