Comando funciona, mas não no script, nem no cron [RESOLVIDO]

1. Comando funciona, mas não no script, nem no cron [RESOLVIDO]

carlos Henrique Sá
kheavy

(usa Debian)

Enviado em 27/06/2014 - 11:02h

Bom dia,

criei um script de backup o qual copia uma arquivo de log por dia de vários servidores e joga em uma pasta padrão, isto está funcionando perfeitamente.

porém para não ficar com muitos arquivos antigos, todo domingo, roda um segundo script o qual faz a reciclagem dos arquivos com mais de 7 dias e os compacta.

se eu digito o comando todo no shell ele roda perfeitamente gera o arquivo com todos os arqiuvos corretos, porém quando executo pelo scritp ele cria um arquivo tar.gz vazio.


find diretorioorigem/ -name *.csv -mtime +$CSV_LIMIT | tar --files-from - -cvzpf /diretriodestino/arquivo.tar.gz




esse é o scrit todo


#var
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin
DIR=/var/boreal/cdr
BKPFILE=cdr-$(date +%W).tar.gz
CSV_LIMIT=7 #7 dias
BKP_LIMIT=56 #8 SEMANAS
LOG=/usr/local/boreal/bin/bkp/bkp-CDR.log

echo "------------INCICIANDO BACKUP------------" >> $LOG
echo `date +%Y-%m-%d` >> $LOG


for TNX in $(cat /usr/local/boreal/bin/bkp/tnx.txt)
do
#clear
DES=`echo $TNX | cut -f2 -d:`
A=`echo $TNX | cut -f3 -d:`
#localiza arquivos e compacta
echo "---$DES -$A---" >> $LOG
echo "Localizando arquivos antigos e compactando de $DIR/$DES" >> $LOG
find "$DIR"/"$DES" -name *.csv -mtime +$CSV_LIMIT | tar --files-from - -cvzpf "$DIR"/"$DES"/"$BKPFILE"
echo "Excluindo os arquivos antigos" >> $LOG
sleep 2
echo "Localizando e excluindo aqruivos de backup com mais de $BKP_LIMIT dias" >> $LOG
find "$DIR"/"$DES" -name cdr* -mtime +$BKP_LIMIT >> $LOG
find "$DIR"/"$DES" -name cdr* -mtime +$BKP_LIMIT -exec rm -rf {} \;
sleep 2
echo "Apagando arquivos .csv com mais de $CSV_LIMIT dias" >> $LOG
find "$DIR"/"$DES" -name *.csv -mtime +$CSV_LIMIT >> $LOG
find "$DIR"/"$DES" -name *.csv -mtime +$CSV_LIMIT -exec rm -rf {} \;
done

echo "----------------FIM BACKUP---------------" >> $LOG






  


2. Re: Comando funciona, mas não no script, nem no cron [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/06/2014 - 11:28h

Faltam informações para precisar o problema exatamente. Mas uma coisa que eu sempre faço e recomendo é que, por segurança, você sempre coloque os argumentos para os predicados -name e -iname do find entre aspas OU com os caracteres especiais, que podem ser interceptados pelo shell, escapados com “\”.

Assim sendo, em lugar de usar
find /somedir -name *.txt 
, é melhor fazer
find /somedir -name "*.txt" 
ou
find /somedir -name \*.txt 
.


3. Re: Comando funciona, mas não no script, nem no cron [RESOLVIDO]

Vitor Augusto M. Pio
vitinho217

(usa Arch Linux)

Enviado em 27/06/2014 - 11:42h

Quais são as permissões necessárias para executar o script devidamente ?

Note que você está manipulando arquivos de root. Por isso tente executar o script como root e veja o que acontece ou use o comando suo antes do script sudo ./<nome do script>.

Caso não funcione tente executar o arquivo em modo debug para verificar o que está acontecendo.

Um abraço.


4. Re: Comando funciona, mas não no script, nem no cron [RESOLVIDO]

carlos Henrique Sá
kheavy

(usa Debian)

Enviado em 27/06/2014 - 12:35h

vitinho217 escreveu:

Quais são as permissões necessárias para executar o script devidamente ?

Note que você está manipulando arquivos de root. Por isso tente executar o script como root e veja o que acontece ou use o comando suo antes do script sudo ./<nome do script>.

Caso não funcione tente executar o arquivo em modo debug para verificar o que está acontecendo.

Um abraço.


os arquivos não estão em uma pasta root, eu já coloquei todos com os mesmo usuário para evitar esse problema.




5. Re: Comando funciona, mas não no script, nem no cron [RESOLVIDO]

carlos Henrique Sá
kheavy

(usa Debian)

Enviado em 27/06/2014 - 12:36h

paulo1205 escreveu:

Faltam informações para precisar o problema exatamente. Mas uma coisa que eu sempre faço e recomendo é que, por segurança, você sempre coloque os argumentos para os predicados -name e -iname do find entre aspas OU com os caracteres especiais, que podem ser interceptados pelo shell, escapados com “\”.

Assim sendo, em lugar de usar
find /somedir -name *.txt 
, é melhor fazer
find /somedir -name "*.txt" 
ou
find /somedir -name \*.txt 
.



Vou testar e digo se funcionou.




6. Re: Comando funciona, mas não no script, nem no cron [RESOLVIDO]

carlos Henrique Sá
kheavy

(usa Debian)

Enviado em 27/06/2014 - 13:58h

não entendi o motivo do erro mas sei que agora funciona....

se eu comentar a linha que exclui os arquivos.csv logo após a compactação do tar.gz, o tar fica vazio, mesmo que eu coloque um sleep ou qq coisa não funciona.

ja revisei 300 vezes o script pra ver o que tinha de errado e não achei...

então dividi em 2 blocos um só compacta e outro só exclui
o script está funcionando e ficou assim


##!/bin/bash
#Script de backup cdr
#2013-12-26 data de criação
#2014-06-27 ultima correção

#var
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin
DIR=/var/boreal/cdr
BKPFILE=cdr-$(date +%W).tar.gz
CSV_LIMIT=7 #7 dias
BKP_LIMIT=56 #8 SEMANAS
LOG=/usr/local/boreal/bin/bkp/bkp-CDR.log

echo "------------INCICIANDO BACKUP------------" >> $LOG
echo `date +%Y-%m-%d` >> $LOG

bkp(){
echo "----------COPIAS----------" >> $LOG
for TNX in $(cat /usr/local/boreal/bin/bkp/tnx.txt)
do
DES=`echo $TNX | cut -f2 -d:`
A=`echo $TNX | cut -f3 -d:`
#localiza arquivos e compacta
echo "---$DES--$A---" >> $LOG
echo "Localizando arquivos antigos e compactando de $DIR/$DES" >> $LOG
find "$DIR"/"$DES" -name *.csv -mtime +$CSV_LIMIT | tar --files-from - -cvzpf "$DIR"/"$DES"/"$BKPFILE"
done
}
bkp
recicla(){
echo "----------EXCLUSAO----------" >> $LOG
for TNX in $(cat /usr/local/boreal/bin/bkp/tnx.txt)
do
#Excluindo os arquivos antigos
echo "---$DES--$A---" >> $LOG
echo "Localizando e excluindo aqruivos de backup com mais de $BKP_LIMIT dias" >> $LOG
find "$DIR"/"$DES" -name "cdr*" -mtime +$BKP_LIMIT >> $LOG
find "$DIR"/"$DES" -name "cdr*" -mtime +$BKP_LIMIT -exec rm -rf {} \;
sleep 1
echo "Apagando arquivos .csv com mais de $CSV_LIMIT dias" >> $LOG
find "$DIR"/"$DES" -name "*.csv" -mtime +$CSV_LIMIT >> $LOG
find "$DIR"/"$DES" -name "*.csv" -mtime +$CSV_LIMIT -exec rm -rf {} \;
done
}
recicla


echo "----------------FIM BACKUP---------------" >> $LOG







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts