Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

1. Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
DrNetwork

(usa CentOS)

Enviado em 26/09/2012 - 10:35h

Olá, eu criei um script que faz o backup das pastas selecionadas em uma só pasta, compacta, manda por email e apaga a pasta original e o backup da semana passada.

A questão é que quando eu mesmo rodo com "./backup.sh", ele faz todas as tarefas com sucesso e o backup está lá no meu email. Mas eu coloquei o job no crontab para rodar toda sexta-feira às 7 da manhã e ele só faz parte do script. Ele chega a criar o arquivo compactado e apaga a pasta backup, mas quando vou olhar no gmail, não tem o email lá...

Segue o script para que vejam se fiz algo de errado:

*******************************************************************
#!/bin/bash
#script de backup do box linux

# Criacao dos diretorios

cd /var
mkdir backup
cd backup
mkdir usr
cd usr
mkdir local
cd local
mkdir nagios
mkdir etc
cd etc
mkdir email
cd /var/backup
mkdir etc
cd etc
mkdir vsftpd
mkdir mrtg
mkdir httpd
cd httpd
mkdir conf
mkdir conf.d
cd /var/backup
mkdir var
cd var
mkdir www
cd www
mkdir html
cd html
mkdir mrtg
cd /var/backup

# pastas a serem copiadas com seu caminho original

yes | cp -rf /usr/local/nagios/* /var/backup/usr/local/nagios
yes | cp -rf /usr/local/etc/email/* /var/backup/usr/local/etc/email/
yes | cp -rf /etc/sudoers /var/backup/etc/sudoers
yes | cp -rf /etc/mrtg /var/backup/etc/mrtg
yes | cp -rf /etc/rc.local /var/backup/etc/rc.local
yes | cp -rf /etc/vsftpd/* /var/backup/etc/vsftpd
yes | cp -rf /etc/httpd/conf/* /var/backup/etc/httpd/conf
yes | cp -rf /etc/httpd/conf.d/* /var/backup/etc/httpd/conf.d
yes | cp -rf /var/www/html/mrtg/* /var/backup/var/www/html/mrtg
yes | cp -rf /var/www/html/*.html /var/backup/var/www/html

#comprimir a pasta de backup em 1 arquivo e apagar a pasta backup

cd /var

tar -zcvf backup_linux_`date +%Y-%m-%d`.tar.gz backup
rm -rf backup

# Envie o log por email

email -b -s "Backup Nagios `date +%Y-%m-%d`" -a /var/backup_linux_`date +%Y-%m-%d`.tar.gz netrocinha@gmail.com

# Apague o backup da semana passada

rm backup_linux_$(date -d "7 days ago" +%Y-%m-%d).tar.gz

echo Finalizado com sucesso!!!
*******************************************************************

E aqui está o crontab que edito com o comando "crontab -e":

0 7 * * 5 sh /root/backup.sh


Agradeço de antemão.


  


2. MELHOR RESPOSTA

João Paulo Carneiro
jptudobem

(usa Debian)

Enviado em 28/09/2012 - 09:46h

#!/bin/bash
#script de backup do box linux

# Criacao dos diretorios

mkdir -p /var/backup/usr/local/nagios
mkdir -p /var/backup/usr/local/etc/email
mkdir -p /var/backup/etc/vsftpd
mkdir -p /var/backup/etc/mrtg
mkdir -p /var/backup/etc/httpd/conf
mkdir -p /var/backup/etc/httpd/conf.d
mkdir -p /var/backup/var/www/html/mrtg

# pastas a serem copiadas com seu caminho original

yes | cp -rf /usr/local/nagios/* /var/backup/usr/local/nagios
yes | cp -rf /usr/local/etc/email/* /var/backup/usr/local/etc/email/
yes | cp -rf /etc/sudoers /var/backup/etc/sudoers
yes | cp -rf /etc/mrtg /var/backup/etc/mrtg
yes | cp -rf /etc/rc.local /var/backup/etc/rc.local
yes | cp -rf /etc/vsftpd/* /var/backup/etc/vsftpd
yes | cp -rf /etc/httpd/conf/* /var/backup/etc/httpd/conf
yes | cp -rf /etc/httpd/conf.d/* /var/backup/etc/httpd/conf.d
yes | cp -rf /var/www/html/mrtg/* /var/backup/var/www/html/mrtg
yes | cp -rf /var/www/html/*.html /var/backup/var/www/html

#comprimir a pasta de backup em 1 arquivo e apagar a pasta backup

cd /var

tar -zcvf backup_linux_`date +%Y-%m-%d`.tar.gz backup
VARAUX=$?

if [ $VARAUX -eq 0 ]; then
# Envie o log por email
/usr/local/bin/email -b -s "Backup Nagios `date +%Y-%m-%d`" -a /var/backup_linux_`date +%Y-%m-%d`.tar.gz netrocinha@gmail.com
$VARAUX=$?
if [ $VARAUX -eq 0 ]; then
echo "Email enviado com sucesso." >> /var/log/debug_script.log
rm -rf backup
else
echo "Erro ao enviar o email." >> /var/log/debug_script.log
fi
else
echo "Erro na criação do backup .tar.gz" >> /var/log/debug_script.log
fi

# Apague o backup da semana passada

rm backup_linux_$(date -d "7 days ago" +%Y-%m-%d).tar.gz


Agora basta verificar o arquivo /var/log/debug_script.log.

3. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Marcos Paulo Ferreira
daemonio

(usa Slackware)

Enviado em 26/09/2012 - 11:14h

Olá,

Esse comando email é o mesmo que o mail? Tente colocar o caminho completo dele e veja se o problema persiste. Tente também utilizar o comando mail.

Sei que o cron tem problemas com PATH e talvez o problema seja isso.

t+


4. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
DrNetwork

(usa CentOS)

Enviado em 26/09/2012 - 12:03h

Eu instalei esse email aí. Funciona legal, mas como vc pediu, eu adicionei " /usr/local/bin/" antes do comando e ficou assim:

/usr/local/bin/email -b -s "Backup Nagios `date +%Y-%m-%d`" -a /var/backup_linux_`date +%Y-%m-%d`.tar.gz netrocinha@gmail.com

Testei o comando na mão e funcionou legal. Pelo Cron, nada feito ainda...


5. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

João Paulo Carneiro
jptudobem

(usa Debian)

Enviado em 26/09/2012 - 12:45h

Em seu crontab existe a variável PATH?


6. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
DrNetwork

(usa CentOS)

Enviado em 26/09/2012 - 12:49h

Agora vc me fez uma pergunta difícil...

Quando digito "crontab -e" utilizando o user root, eis o que aparece:

0 7 * * 5 root /root/backup.sh

só isso! Eu alterei um pouquinho do original que era

0 7 * * 5 sh /root/backup.sh

(achava que tinha que colocar o comando "sh" antes e nem sabia que tinha que botar o user)

Bom, pra resumir, não entendi sua pergunta e não sei se a respondi. :/


*********
*Editado*
*********

Encontrei na net que deveria ter algo como

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

é isso que vc ta falando? Devo adicionar isso ao meu crontab?


7. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/09/2012 - 12:59h

melhore esse script tbm

troque isso:

cd /var
mkdir backup
cd backup
mkdir usr
cd usr
mkdir local
cd local
mkdir nagios
mkdir etc
cd etc
mkdir email
cd /var/backup
mkdir etc
cd etc
mkdir vsftpd
mkdir mrtg
mkdir httpd
cd httpd
mkdir conf
mkdir conf.d
cd /var/backup
mkdir var
cd var
mkdir www
cd www
mkdir html
cd html
mkdir mrtg
cd /var/backup


por isso:

mkdir -p /var/backup/usr/local/nagios
mkdir -p /var/backup/usr/local/etc/email

mkdir -p /var/backup/etc/vsftpd
mkdir -p /var/backup/etc/mrtg
mkdir -p /var/backup/etc/httpd/conf
mkdir -p /var/backup/etc/httpd/conf.d

mkdir -p /var/backup/var/www/html/mrtg
cd /var/backup


8. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
DrNetwork

(usa CentOS)

Enviado em 26/09/2012 - 13:02h

Valeu Douglas, depois que estiver funcionando, eu faço esse tipo de melhoria. Por enquanto quero mexer o mínimo possível só para fazer funcionar. obrigado.


9. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

João Paulo Carneiro
jptudobem

(usa Debian)

Enviado em 26/09/2012 - 13:04h

Quando você executa o contrab -e, nas primeiras linhas, deve ter setado o PATH, se não tiver, adicione da seguinte forma:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/bin:/usr/sbin
SHELL=/bin/bash




10. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

João Paulo Carneiro
jptudobem

(usa Debian)

Enviado em 26/09/2012 - 13:06h

DrNetwork escreveu:

*********
*Editado*
*********

Encontrei na net que deveria ter algo como

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

é isso que vc ta falando? Devo adicionar isso ao meu crontab?


EXATAMENTE! Adicione isso no início do seu crontab.

Perguntas: O script tem permissão de execução para todos usuários? Na dúvida, execute: chmod +x script.sh




11. use o tar

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/09/2012 - 15:01h

Seu script pode ser bastante simplificado se no lugar de simplesmente copiar os arquivos você realmente fizer um backup com tar que é muito mais seguro e a forma correta de preservar as permissões e dados dos arquivos.

A opção --files-from=FILE permite ter um catálogo dos diretorios e arquivos que você deseja incluir no backup.

Crie um arquivo chamado /root/backup.conf com VI ou outro editor de texto puro e inclua APENAS os diretórios ou arquivos que deseja fazer backup.

# insira isso em /root/backup.conf
/usr/local/nagios/
/usr/local/etc/email/
/etc/sudoers
/etc/mrtg
/etc/rc.local
/etc/vsftpd/
/etc/httpd/conf/
/etc/httpd/conf.d/
/var/www/html/mrtg/
/var/www/html/

Manter somente o último backup é uma estrategia fraca.
Tenha pelo menos 3 backups diferentes
Enviar o backup por e-mail, além de inseguro não é prático.
use SSH, scp ou RSYNC para pegar o backup e mandar para outra máquina ou simplesmente cópie para uma unidade de disco diferente.

O código abaixo pode ser uma sugestão para você começar implementar um script com tar...



#! /bin/bash

NEWBACKUP=$(date +%Y%m%d)

tar -pcf /var/backups/backup-$NEWBACKUP.tar --files-from=/root/backup.conf

if [ $? == 0 ]

then
echo "Criado novo backup em $NEWBACKUP" >> /var/log/backup.log
#...coloque aqui o aviso por e-mail em caso de sucesso

else
echo "Falha na criação de backup em $NEWBACKUP" >> /var/log/backup.log
#....coloque aqui o aviso por e-mail em caso de falha.....
exit 1

fi
exit 0


Olha no crontab não inclua somente o nome do script root/script.sh não é necessário incluir o sh antes....









12. Re: Script roda 100% manualmente, mas só em parte pelo crontab [RESOLVIDO]

Rafael Carvalhido (Dr.Network)
drnetwork

(usa CentOS)

Enviado em 27/09/2012 - 11:19h

jptudobem, coloquei as variáveis, mas não houve diferença. Pra que dar permissão para todos? Não basta o root ter permissão? A permissão dele já não é automática?

Kyetoy, sua sugestão do backup com tar é ótima. Vou estudá-la melhor e implementar. Quanto ao backup ser enviado para o email, isso é o que o dono quer (microempresa sem recursos).

Quanto ao crontab, não to mais usando o "crontab -e"... Quando boto uma hora específica pra rodar (tipo T +1 minuto) ele não vai. Alterei em /etc/cron.d/backup (um arquivo que criei). Esse sim roda legal e é todo colorido com o VIM (convenhamos, facilita a visualização).

Conteúdo do arquivo especificado acima:

***********************************
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=root
HOME=/
0 7 * * 5 root /root/backup.sh
***********************************

No entanto, o problema persiste. rodando manualmente, o backup chega na inbox do email especificado. Rodando pelo cron, ele cria o backup na máquina mas o email não chega na inbox.


Existe uma maneira da gente fazer um Debug disso?



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts