Outro dia atualizei o que faltava no meu shell script para fazer backup usando o rsync.
Adicionei o wakeonlan para ligar a máquina remotamente (necessário descobrir o HW address da sua máquina de destino e se certificar de que é possível ligá-la remotamente — possível que tenha que ativar essa opção na BIOS), dei uma arrumadinha, incluí a opção de excluir arquivos e pastas do backup (ver abaixo) e adicionei num cron job para fazer um backup diário. Além disso, o script desliga a máquina depois do fim do backup. Aqui está:
#!/bin/bash # Script para backup via SSH usando o rsync # Versão 0.8 - 2009/09/05 # # # # # # Configuração # # # # # # # Mude os parâmetros abaixo, referentes ao seu sistema # Arquivo log LOG=/home/user0/.backup`date +%Y-%m-%d`.log # IP ou hostname da máquina de destino DESTINO=destino.local # Usuário no destino USR=user1 # Diretório de destino DIR=/home/user1/Backup/ # Diretório de origem SRC=/home/user0 # Arquivo com lista de arquivos e diretórios # que não serão incluídos no backup EXCLUIR=/home/user0/.rsync/exclude # HW address HW=00:ee:dd:cc:bb:aa # # # # # # Configuração # # # # # # # # # # # # # Funções # # # # # # # function ligada { # Checar se a máquina de destino está ligada echo -e "Checando se $DESTINO está ligada..." /bin/ping -c 1 -W 2 $DESTINO > /dev/null if [ "$?" -ne 0 ]; then return 1 else return 0 fi } function run_backup { HORA_INI=`date +%s` echo -e `date +%c` >> $LOG echo -e "\n$DESTINO ligado!" >> $LOG echo -e "Iniciando o backup...\n" >> $LOG rsync -ah --delete --stats --progress --log-file=$LOG --exclude-from=$EXCLUIR -e ssh $SRC $USR@$DESTINO:$DIR HORA_FIM=`date +%s` TEMPO=`expr $HORA_FIM - $HORA_INI` echo -e "\nBackup finalizado com sucesso!" >> $LOG echo -e "Duração: $TEMPO s\n" >> $LOG echo -e "--- // ---\n" >> $LOG echo -e "\nBackup finalizado com sucesso!" echo -e "Duração: $TEMPO s\n" echo -e "Consulte o log da operação em $LOG.\n" } # # # # # # # Funções # # # # # # # # # # # # # # Programa # # # # # # # # Checar se a máquina de destino está ligada ligada if [ "$?" -eq "1" ]; then echo -e "\n$DESTINO desligado. Tentando acordá-lo..." wakeonlan $HW echo -e "\nPacote mágico enviado. Aguarde." sleep 70 ligada if [ "$?" = "1" ]; then echo -e `date +%c` >> $LOG echo -e "\n$DESTINO desligado." >> $LOG echo -e "Backup não realizado\n" >> $LOG echo -e "--- // ---\n" >> $LOG echo -e "\n$DESTINO desligado." echo -e "Backup não realizado.\n" else echo -e "\n$DESTINO ligado! Começando o backup..." run_backup fi else echo -e "\n$DESTINO ligado! Começando o backup..." run_backup fi echo -e "Desligando o $DESTINO..." ssh $USR@$DESTINO 'sudo halt' echo -e "Pronto. Tchau!" # # # # # # # Programa # # # # # # # # # # # # # # Afazeres # # # # # # # # # - Criar alça para quando a transferência falhar (e.g.,falta de espaço)
Meu arquivo exclude, com a lista de arquivos e pastas que não serão incluídas no backup ficou assim:
.thumbnails/
Picasa.ini
Thumbs.db
.local/share/Trash/
.cache/
.gvfs/
11 respostas em “Shell script para backup: nova versão”
gostei!
[…] [Fiz uma versão nova, mais completa, deste script. Confira aqui.] […]
Esse script de backup é FANTÁSTICO, PERFEITO para o que estou precisando, ele serve para estações que tenham win XP ou 7 para enviar o backup ao windows server 2008??? Valeuuuuu
Oi Juliano, não faço idéia. Você está dizendo rodar o script por uma máquina com linux para enviar o backup para a máquina com windows? Se for isso talvez até funcione se vc tiver ssh instalado no windows (e o rsync). Agora rodar o script partir do windows acho que não funciona não… teria que portar pra outra linguagem como python ou perl.
Como eu devo colocar no arquivo exclude para que não seja realizada a cópias de arquivos do tipo .mp3, .avi, etc..
tentei de diversas formas e não funcionou.
Oi Gabriel, é só colocar em uma nova linha: *.mp3
Assim o comando não vai mais copiar arquivos terminados em mp3. No entanto, se vc quiser excluir os arquivos mp3 que já estiverem no destino (eg pq vc já havia rodado o rsync) basta acrescentar na linha de comando a opção –delete-excluded. Ele vai ler suas regras de exclusão e apagar estes arquivos no destino.
Faça uns testes pra ver como funciona antes de rodar nos seus arquivos oficiais.
Muito bom script, estou utilizando no meu servidor de arquivos para backup…
Ótimo script… vc poderia torná-lo mais eficiente se na linha 54 “rsync -ah –delete –stats –progress –log-file=$LOG –exclude-…”, acrescentasse ao rsync a sintaxe ” rsync -Cravzup –delete –stats –progress –log-file=$LOG –exclude-from=$EXCLUIR -e ssh $SRC $USR@$DESTINO:$DIR
,ou seja, a sintaxe Cravzup
C: auto-ignorar arquivos idênticos;
-r: copiar de forma recursive, ou seja, todos os diretórios e subdiretórios no caminho especificado;
-a: indica que estarão sendo copiados arquivos;
-v: modo verboso, mais informações da cópia;
-z: comprime os arquivos durante a cópia;
– u : Update
-p: indicador de progresso de cópia.
Torna o backup mais eficiente…
falows
Valeu, legal que está usando :)
O “-a” é equivalente à “-rlptgoD” portanto não precisaria do “-r” ou do “-p”. Na verdade o único que pode deixar mais eficiente é o “-z” que comprime os arquivos antes de enviar pela rede.
O “-u” faz o backup pular os arquivos cuja cópia no destino está com a data de modificação mais nova. Isso é útil para fazer sincronização entre computadores, mas neste caso é um backup de uma via só, sempre do meu computador para outra máquina. Portanto, independente do arquivo ter sido modificado no destino (eg. posso ter entrado e acessado alguma coisa por ela), a cópia da minha máquina vai sobrepor.
Já o “-p” serve para manter as permissões dos arquivos em ordem, o progresso é controlado pelo argumento “–progress”.
Tem a lista completinha das opções do rsync aqui: http://www.samba.org/ftp/rsync/rsync.html
Abraço
Olá Nelas! Estou aprendendo como fazer script e comecei a pesquisar recentemente como posso realizar backup em um servidor (Backup) utilizando o SSH de outros servidores “clientes”. No seu script observei vc utilizando o SSH porém em que momento a senha de login é passada?
Oi Saylon, quando você rodar o script ele vai pedir a senha para conectar. Se você não quiser que ele pergunte a senha (não vai rodar até vc colocar a senha manualmente e apertar enter) dá pra configurar o ssh.
Aqui tem algumas dicas pra fazer isso: http://blogs.perl.org/users/smylers/2011/08/ssh-productivity-tips.html