Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: apache_am em 28 de Junho de 2006, 14:15
-
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.
-
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,
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
-
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
-
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
-
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
-
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
-
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
-
ainda sem solução... :-\
-
clcampos,
você que é um Dino nos scripts da uma luz ai, pq o script acima não zipa as pastas ? ;D
-
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?
-
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?
-
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.
-
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
-
Mas qual é o conteúdo do arquivo?
-
Mas qual é o conteúdo do arquivo?
GNU nano 1.3.10 File: /tmp/crontab.3GlVvk/crontab
# m h dom mon dow commad
52 14 * * * root echo "teste" > teste
ele está executando o comando acima blz criando o arquivo teste contendo a palavra "teste", mas se altero o comando para executar o script backup.sh na pasta home ele não executa, ainda não consegui identificar minha falha para executar um e recusar o outro.
-
Observe a mensagem que te enviei: http://ubuntuforum-br.org/index.php/topic,7715.msg145172.html#msg145172
Nele peço para você alterar os comandos, e ao contrário da execução eles apenas será criado um arquivo. Gostaria de ver este arquivo criado, que no meu exemplo esta com o nome de: TesteBesta
-
tentei pelo crontab e ele não criou o arquivo TesteBeta, agora se for pelo terminal ele cria sem problemas.
-
clcampos,
o script que me ajudou rodou blz, mas quando inclui o restante das pastas ele simplesmente não executa, mas quando rodo pelo terminal o backup.sh sem o sudo vai tranquilo.
segue o "mardito"
#!/bin/bash
#
# BACKUP
#
#
# Rafael Navas Neto rafasnnlinux@uol.com.br
#
# 14/09/2007
DATA=`date +%d%m%y_%H%M` # data_hora
#PATHout="/home/backup" # Diretório de Saida
#PATHin="/home/dct_almoxarifado" # Diretório de Entrada
#nARQout="_dct_almoxarifado.tar.gz"
#nARQout="$DATA$nARQout" # nome do Arquivo de Saída
#echo "tar czvf $PATHout/$nARQout $PATHin" >> $PATHout/Testebeta
#tar czvf $PATHout/$nARQout $PATHin
tar czvf /home/s1/$DATA-database.tar.gz /home/database
tar czvf /home/s1/$DATA-dct_almoxarifado.tar.gz /home/dct_almoxarifado
tar czvf /home/s1/$DATA-dct_compras.tar.gz /home/dct_compras
tar czvf /home/s1/$DATA-dct_financeiro.tar.gz /home/dct_financeiro
tar czvf /home/s1/$DATA-dct_vendas.tar.gz /home/dct_vendas
tar czvf /home/s1/$DATA-dct_locacao.tar.gz /home/dct_locacao
tar czvf /home/s1/$DATA-dct_recepcao.tar.gz /home/dct_recepcao
tar czvf /home/s1/$DATA-dct_rafael.tar.gz /home/dct_rafael
tar czvf /home/s1/$DATA-dct_email.tar.gz /home/email
tar czvf /home/s1/$DATA-dct_programas.tar.gz /home/programas
tar czvf /home/s1/$DATA-dct_instalacao.tar.gz /home/instalacao
tar czvf /home/backup/$DATA-backup.tar.gz /home/s1/*.tar.gz
rm -rf /home/s1/*
-
Para que precisa do sudo para rodar isto? Quando acessei seu PC não deixamos configurado para que o agendamento fosse feito pelo usuário s1 sem a necessidade de sudo nem nada?
-
como disse, sem sudo
-
como disse, sem sudo
Você adicionou os grupos dos outros diretórios ao usuário s1?
-
clcampos,
não o fiz, nos grupos das pastas inclui o usuário s1, ele acessa e altera todas as pastas
-
Sem necessitar do sudo?
-
sim, direto pelo usuário s1 ele roda blz, mas no crontab não, não sei aonde errei.
-
Como chama o crontab?
-
segue:
# m h dom mon dow command
27 23 * * * /home/backup.sh
-
segue:
# m h dom mon dow command
27 23 * * * /home/backup.sh
Beleza, e então, como você chama o crontab?
-
clcampos
chamo assim:
crontab -e
-
clcampos,
o meu problema poderia estar ligado a limitação de memória, o script trabalhando em bash ou pelo terminal utiliza a memória de forma diferente?
-
ainda sem solução... :-\
o problema poderia estar ligado a memória do pc ao rodar o script em bash?