Script para baixar dados sem interrupção

Sugestão de rotina em shell script para baixar dados de vários computadores (aqui chamados de estações). Essas estações devem estar configuradas com o ip relacionado ao nome da estação (indicado depois do traço, por exemplo, est1) no arquivo "/home/user/.ssh/config". O comando utilizado é o rsync em conjunto com o sshpass, que dispensa a intervenção do usuário em digitar a senha. Além de baixar os dados, esse script verificar qual o tamanho e ocupação da partição utilizada através do comando "df -h". Essa informação (adicionada de eventuais erros de conexão) é impressa no arquivo "status_hd_erros_estacoes.txt". Esse script recebe como argumentos o ano e o mês, devendo ser executado como "./nome_do_script 2015 01", por exemplo.

#!/bin/bash
# Script para baixar dados das estações
ano=$1
mes=$2

# Criar arquivo de status (caso não exista) e apagar seu conteúdo
touch status_hd_erros_estacoes.txt
echo > status_hd_erros_estacoes.txt
path='/dados/estacoes'

# Estações com acesso SSH
estrx=( Estacao1-est1 Estacao2-est2 )
for temp in "${estrx[@]}"; do
	estacao=`echo $temp |cut -d'-' -f1`
	est=`echo $temp |cut -d'-' -f2`
	cd $path/$estacao/dados
	mkdir -p $ano
	cd $ano
	echo $estacao >> $path/status_hd_erros_estacoes.txt
	sshpass -p "SENHA" rsync -azv --progress user@$est:/home/user/dados/$ano-$mes-* . 2>> $path/status_hd_erros_estacoes.txt
	# Ver tamanho da partição de dados
	sshpass -p "SENHA" ssh user@$est "df -h | grep home" >> $path/status_hd_erros_estacoes.txt
	echo "----------" >> $path/status_hd_erros_estacoes.txt
done

# Station tem conexão instável, precisa script próprio
echo Station >> $path/status_hd_erros_estacoes.txt
sshpass -p "SENHA" ssh user@station "df -h | grep home" >> $path/status_hd_erros_estacoes.txt
cd $path/Station/dados
mkdir -p $ano
cp $path/restartdownload.sh $path/Station/dados/$ano
cd $ano
./restartdownload.sh $ano $mes
rm restartdownload.sh

A seguir, está o script "restartdownload.sh" chamado anteriormente. Ele verifica a cada cinco minutos se o tamanho da pasta mudou; se não mudou, é porque não baixou nada, então deve abortar conexão anterior e abrir uma nova, "matando" o processo anterior (o comando "$!" pega PID do processo que acabou de ser enviado).

#!/bin/bash
# Script para baixar dados de computador configurado no ssh chamado 'station'
# e reiniciar automaticamente caso conexão fique muito ruim
# (executar na pasta onde os dados serão gravados)

ano=$1
mes=$2

sshpass -p "senha" rsync -azv --progress user@station:/home/user/dados/$ano-$mes-* .&
pid=$!
while :
do
        sizedir=`du -ls`
        #echo $sizedir
        sleep 300 # espera cinco minutos pra tentar verificar novamente
        sizedir2=`du -ls`
        #echo $sizedir2
        # se o tamanho da pasta não mudar, cancelar conexão
        if [ "$sizedir" == "$sizedir2" ];
        then
                #pid=`ps aux | grep rsync | awk '{ print $2  }'`
                kill -9 $pid
                sshpass -p "SENHA" rsync -azv --progress user@station:/home/user/dados/$ano-$mes-* .&
                pid=$!
        fi
done

Uma alternativa (caso o rsync seja interrompido por algum outro erro) pode ser vista nesse link: Automatically Check RSYNC and Restart if Stopped.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.