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