Duvidas script executado pelo crontab [RESOLVIDO]

1. Duvidas script executado pelo crontab [RESOLVIDO]

Giovani Jorge Vargas
giovanijorge

(usa Ubuntu)

Enviado em 20/03/2013 - 14:45h

Este script abaixo, realiza o teste pra saber se o HD externo USB está montado e no diretório certo.
Porém ele só funciona em linha de comando, no crontab ele vai até a linha:
...
echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG
...

Ele está saindo ou parando inesperadamente deste ponto em diante. Acredito que o problema esteja no teste que estou fazendo com o comando "if". mas o que está faltando?

Valeu!!



#!/bin/bash


#redirecionar saida de erro
exec 2> /var/log/bkpHD_ERRO$DATA.log
exec >&2

# Variaveis

DATA=`date +%y%m%d%H%M`
LOG=/var/log/bkpHD$DATA.log
blkid | awk '{print}' | grep 'UUID="14982BBF522ED2D1"' > /tmp/testeHD.txt


# Inicio do script

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG

# testa se o HD externo esta conectado corretamente

if cat /tmp/testeHD.txt | grep /dev/sda1 && df -h | awk '{print}' | grep '/media/hdexterno' ; then

# sincronizando

rsync -vaxE /home/xxx/publico/ /media/hdexterno/ >> $LOG


echo "==" >> $LOG
echo " Sincronismo concluido" >> $LOG

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Fim de rotina..." >> $LOG



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/03/2013 - 04:32h

giovanijorge escreveu:

Este script abaixo, realiza o teste pra saber se o HD externo USB está montado e no diretório certo.
Porém ele só funciona em linha de comando, no crontab ele vai até a linha:
...
echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG
...

Ele está saindo ou parando inesperadamente deste ponto em diante. Acredito que o problema esteja no teste que estou fazendo com o comando "if". mas o que está faltando?


Já tentou rodar o script com os flags -x e -v (i.e., colocando a primeira linha na forma "#!/bin/bash -xv", ou executando o comando "set -xv" logo abaixo)?

#!/bin/bash


#redirecionar saida de erro
exec 2> /var/log/bkpHD_ERRO$DATA.log
exec >&2


Não é normal ver redirecionamentos dessa forma. Normalmente se redireciona a saída padrão primeiro, e depois a saída de erro por cima dela.

Em todo caso, se você fizer a depuração com os flags que eu indiquei acima, os comandos serão mostrados na saída de erro.

# Variaveis

DATA=`date +%y%m%d%H%M`
LOG=/var/log/bkpHD$DATA.log
blkid | awk '{print}' | grep 'UUID="14982BBF522ED2D1"' > /tmp/testeHD.txt


Para quê esse "awk '{print}'"? Isso não faz nada além de criar um processo que imprime exatamente o que recebe. Você pode seguramente suprimi-lo aqui e nos outros lugares em que o escreveu.

# Inicio do script

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG

# testa se o HD externo esta conectado corretamente

if cat /tmp/testeHD.txt | grep /dev/sda1 && df -h | awk '{print}' | grep '/media/hdexterno' ; then


A tal saída indesejável para a tela, sobre que você comenta na respota que deu depois da postagem original, é a saída do grep? Acho que sim, pois você redirecionou todas as outras saídas para $LOG ou outros destinos. Você pode suprimir a saída do grep, usando somente o valor de retorno para indicar ao shell se a saída existe ou não através da opção "-q" (ou pode redirecionar a saída dele para /dev/null, se preferir).

# sincronizando

rsync -vaxE /home/xxx/publico/ /media/hdexterno/ >> $LOG


echo "==" >> $LOG
echo " Sincronismo concluido" >> $LOG

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Fim de rotina..." >> $LOG


Você não colocou na sua postagem o fi correspondente ao if. Se não foi esquecimento durante a transcrição, então o shell vai rejeitar o script.

----

Mas precisa mesmo de toda essa complicação? Pelo que eu entendi, você quer fazer um backup (semi-)automático se um determinado HD estiver montado num determinado diretório. Para tanto você poderia usar uma lógica bem mais simples, como testar a existência de um determinado arquivo que só seria possível se o HD estivesse montado no lugar desejado. Na mesma linha, mas com um pouco mais de segurança, você poderia testar se o arquivo, além de existir, possui uma determinada assinatura criptográfica forte e difícil de ser recriada (por exemplo, você criou o arquivo com dados aleatórios, obtidos a partir de /dev/random).

Por exemplo, imagine que, num primeiro momento, eu gero o arquivo /media/hdextrno/meu_arquivo_secreto da seguinte maneira.

dd if=/dev/random of=/media/hdextrno/meu_arquivo_secreto bs=512 count=1 


O conteúdo desse arquivo deve ficar somente no HD externo. Você não precisa (e nem deve) conhecê-lo. Mas você vai gerar uma assinatura desse arquivo e guardar na sua home area, com um comando como o que vai abaixo.

sha256sum /media/hdextrno/meu_arquivo_secreto > /home/fulano/hd_ext.sum 


Com isso, o seu script de backup poderia ser simplificado ao ponto de se parecer com o seguinte bloco.

#!/bin/sh

PATH="/bin:/usr/bin"
export PATH

MARKER_FILE="/media/hdextrno/meu_arquivo_secreto"
SIGN_FILE="/home/fulano/hd_ext.sum"

if [ -f "$MARKER_FILE" ] && sha256sum --status --check "$SIGN_FILE"; then
rsync -vaxE /home/xxx/publico/ /media/hdexterno/
fi


3. Re: Duvidas script executado pelo crontab [RESOLVIDO]

Jonathan Wolff Andrade
jwolff

(usa Kali)

Enviado em 20/03/2013 - 16:35h

giovanijorge escreveu:

Este script abaixo, realiza o teste pra saber se o HD externo USB está montado e no diretório certo.
Porém ele só funciona em linha de comando, no crontab ele vai até a linha:
...
echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG
...

Ele está saindo ou parando inesperadamente deste ponto em diante. Acredito que o problema esteja no teste que estou fazendo com o comando "if". mas o que está faltando?

Valeu!!



#!/bin/bash


#redirecionar saida de erro
exec 2> /var/log/bkpHD_ERRO$DATA.log
exec >&2

# Variaveis

DATA=`date +%y%m%d%H%M`
LOG=/var/log/bkpHD$DATA.log
blkid | awk '{print}' | grep 'UUID="14982BBF522ED2D1"' > /tmp/testeHD.txt


# Inicio do script

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Inicio de rotina..." >> $LOG
echo "==" >> $LOG

# testa se o HD externo esta conectado corretamente

if cat /tmp/testeHD.txt | grep /dev/sda1 && df -h | awk '{print}' | grep '/media/hdexterno' ; then

# sincronizando

rsync -vaxE /home/xxx/publico/ /media/hdexterno/ >> $LOG


echo "==" >> $LOG
echo " Sincronismo concluido" >> $LOG

echo "==" >> $LOG
echo "[`date +%H%M%S`] === Fim de rotina..." >> $LOG


Cara. Eu acredito que seja o seguinte:
1 - O Bash nem chegou a compilar a linha do "if",se deu erro na "echo "==" >> $LOG" que é antes da mesma.
2 - Quando você executa o Script direto,provavelmente o executa como Root,então não terá problemas. Mas a cron neste caso pode estar sendo utilizada por outro usuário e possivelmente não ter permissões.

Liste pra mim o resultado dos comandos abaixo:
#ls -la /var/spool/cron/crontabs/*

#ls -la /var/log/bkp*log

#ls -la /tmp/testeHD.txt


4. Re: Duvidas script executado pelo crontab [RESOLVIDO]

Giovani Jorge Vargas
giovanijorge

(usa Ubuntu)

Enviado em 20/03/2013 - 18:00h

No arquivo de log gerado aparece as linhas
...
==
[163001] === Inicio de rotina...
==
...

Isso indica que o script foi executado após o echo "==" >> $LOG.

Eu sei que o script não pode gerar saída de tela no cron. Na primeira versão do script ele não tinha o direcionamento da saída padrão para a saída de erro:
...
exec >&2
...

Então quando executava o script "bkpHD" funcionava em linha de comando, porém ele retornava uma saída na tela no momento do teste "if" e no cron não funcionava, veja:
...
/dev/sda1: LABEL="hdexterno" UUID="14982BBF522ED2D1" TYPE="ntfs"
/dev/sda1 466G 54G 412G 12% /media/hdexterno
...

Pesquisei na internet como executar o teste e não ocorrer saída de tela, tentei assim:

1º usando $(comando) && $(comando) ; then

if $(cat /tmp/testeHD.txt | grep /dev/sda1) && $(df -h | awk '{print}' | grep '/media/hdexterno') ; then

2º usando {comando} && {comando}

3º usando [comando] && [comando]

E nada deu certo. Daí veio a ideia de direcionar a saída padrão "exec >&2", que também não funcionou.

Por fim Comunidade!! heheh.

A saída do comando é:

ls: impossível acessar /var/spool/cron/crontabs/*: Arquivo ou diretório não encontrado




5. Re: Duvidas script executado pelo crontab [RESOLVIDO]

Jonathan Wolff Andrade
jwolff

(usa Kali)

Enviado em 21/03/2013 - 08:04h

Tente seguir as dicas do Paulo ae,ele tem bem mais experiência que eu :)

Boa Sorte


6. Re: Duvidas script executado pelo crontab [RESOLVIDO]

Giovani Jorge Vargas
giovanijorge

(usa Ubuntu)

Enviado em 21/03/2013 - 09:17h

Eu apenas suprimi o "fi" do fórum, ele existe no script.

A unica razão de fazer o teste "/dev/sda1" e "/media/hdexterno", é que o servidor quando reiniciado por uma queda de energia muito prolongada (não é comum), ao subir ele acaba trocando o /dev/sda1 para /dev/sdb1, invertento com o HD do próprio sistema instalado.

Com isso ele cria um diretório "/media/hdexterno_" para diferenciar da pasta criada "/media/hdexterno". Como ele não fazia o teste o script tentava jogar tudo na pasta "/media/hdexterno" e lotava o HD ou o "/".

Fiz uma alteração no fstab colocando a UUID do HD externo, antes de fazer estas alterações no script, para ter certeza de que ao montar ele esteja sempre no "/media/hdexterno". Não tive como testar pois é difícil fazer uma parada no servidor devido a algumas exigências do cliente, porém estou esperando um feriado prolongado, pois a loja fica em funcionamento de segunda a domingo.

Gostei da sua sujestão de script, mas você acredita que posso ter esse problema informado novamente? Ou uma sugestão melhor do que fiz?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts