Rotinas e exemplos de script para backup em bash.
Procure dividir o backup em arquivos, pode ser por diretórios, tipo de arquivo ou outro critério que melhor lhe atende.
A linha de comando abaixo cria um arquivo com todos os diretório de /home, use seu editor preferido para ajustar ou excluir eventuais sub-diretórios, a primeira linha funciona no SUSE 10.1 e a segunda no CL10, o resultado pode ser diferente em sua instalação, deve ter um diretório por linha neste formato.
/home/contabil /home/netlogon /home/vendas /home/zago
ls -ld /home/* | awk '{print $9}' > /tmp/dirhome.txt
ls -ld /home/* | awk '{print $8}' > /tmp/dirhome.txt
Script para backup diário de diretórios listados em arquivo especifico, com rodizio semanal, no momento da cópia apaga os arquivos correspondente ao dia da semana (semana anterior). Neste intervalo de tempo pode gravar em CD ou copiar para outro local via NFS, SSH, FTP ou outro meio.
Este script requer arquivo com a listagem do diretórios, neste tutorial tem tópico especifico com dicas para criar o arquivo dirhome.txt indicado no script.
Coloque seus comandos no inicio do script para montagem de HD, NFS ou troca de diretório local
Lembre de usar if para testar o resultado dos comandos, espaço em disco, verficação do banco de dados, usuários conectados e outras verificações.
Inclua comandos para salvar mensagens em arquivo
Coloque o script no crontab ou diretório desejado do cron, veja tutorial data.html
Uma maneira bem simples e prática, colocar o script dentro de /etc/cron.hourly e acrescentar no inicio do script esta rotina para testar a hora, assim o script é executado de hora em hora, quando a hora atual coindicir com a definida no (if), comparador do script, automaticamente executa o script, nas demais horas do dia sai fora sem executar os demais comandos, pode colocar varios scripts no diretório, assim pode executar varias rotidas de backup durante o dia, ajuste a condição hora para cada escript.
Exemplo de rotina para testar de hora em hora e executar o script as 22 horas, tem que ficar no inicio do script.
HATUAL=$(date +%H) if [ "$HATUAL" -eq "22" ]; then echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt else exit 1 fi
A seguir, exemplo de script com o rotina acima, todo dia às 22 horas faz copia no mesmo HD em /backup, na primeira tentativa de executar vai retornar erro pela falta do arquivo /backup/dirhome.txt que contém a lista de diretórios, altere no script ou crie o diretório e faça copia do arquivo.
#!/bin/bash HATUAL=$(date +%H) if [ "$HATUAL" -eq "22" ]; then echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt else exit 1 fi ls -d /backup if [ $? -ne 0 ];then mkdir -p /backup/{seg,ter,qua,qui,sex,sab,dom} if [ $? -ne 0 ];then echo " falha na tentativa de criar diretórios, requer poderes de root" exit 1 fi fi if [ -f /backup/dirhome.txt ]; then #seus comandos aqui quando existir o arquivo. echo "tudo OK iniciando o backup." else #seus comandos aqui quando não existe o arquivo. echo "falta arquivo /backup/dirhome.txt lista de diretorios para backup." echo "provicencie o arquivo ou correção no caminho do mesmo" exit 1 fi MNUMDIA=$(echo `date +%u`) case $MNUMDIA in 1) MDIA=seg ;; 2) MDIA=ter ;; 3) MDIA=qua ;; 4) MDIA=qui ;; 5) MDIA=sex ;; 6) MDIA=sab ;; 7) MDIA=dom ;; esac cd /backup/$MDIA rm -rf /backup/$MDIA/* while read LINHA ; do MDIR=`echo $LINHA | sed "s|/||g"` MMES=`date +'-%d-%b-%Y.tar.gz'` MARQUIVO=`echo $MDIR$MMES` /bin/tar czf $MARQUIVO $LINHA echo "retorno de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt echo `date` >> /tmp/logbackup.txt done < /backup/dirhome.txt # backup do resto do home, pegar eventuais diretórios novos. /bin/tar czf homeoutros-`date +%d%m%y`.tar.gz /home --exclude-from=/backup/dirhome.txt # backup do /tmp /bin/tar czf dirtemp-`date +%d%m%y`.tar.gz /tmp # remover arquivos com mais de 10 dias /bin/find /backup/ -name "*.tar.gz" -mtime +10 -exec rm {} \; # enviar por scp para outra maquina, requer ssh sem senha configurado /usr/bin/sudo -u zago /usr/bin/scp * zago@192.168.1.205:/home/copias/samba echo "status scp $? " >> /tmp/logbackup.txt # acrescente seus comandos para desligar, limpar lixeira e etc...
#!/bin/bash HATUAL=$(date +%H) if [ "$HATUAL" -eq "22" ]; then echo "iniciando backup das 22 horas " >> /tmp/logbackup.txt else exit 1 fi ls -d /mnt/hd2/home if [ $? -ne 0 ];then mount /dev/hdc2 /mnt/hd2 if [ $? -ne 0 ];then echo " falha na tentativa de montar /dev/hdc2, saindo sem fazer o backup" # coloque aqui as mensagens e arquivo que deseja salvar o aviso exit 1 fi fi ls -d /mnt/hd2/backup if [ $? -ne 0 ];then mkdir -p /mnt/hd2/backup/{seg,ter,qua,qui,sex,sab,dom} if [ $? -ne 0 ];then echo " falha na tentativa de criar diretórios, requer poderes de root" exit 1 fi fi if [ -f /mnt/hd2/backup/dirhome.txt ]; then #seus comandos aqui quando existir o arquivo. echo "tudo OK iniciando o backup." else #seus comandos aqui quando não existe o arquivo. echo "falta arquivo /mnt/hd2/backup/dirhome.txt lista de diretorios para backup." echo "provicencie o arquivo ou correção no caminho do mesmo" exit 1 fi MNUMDIA=$(echo `date +%u`) case $MNUMDIA in 1) MDIA=seg ;; 2) MDIA=ter ;; 3) MDIA=qua ;; 4) MDIA=qui ;; 5) MDIA=sex ;; 6) MDIA=sab ;; 7) MDIA=dom ;; esac cd /mnt/hd2/backup/$MDIA # cuidado com rm a seguir, apaga tudo do diretório do dia do backup rm -rf /mnt/hd2/backup/$MDIA/* while read LINHA ; do MDIR=`echo $LINHA | sed "s|/||g"` MMES=`date +'-%d-%b-%Y.tar.gz'` MARQUIVO=`echo $MDIR$MMES` /bin/tar czf $MARQUIVO $LINHA echo "retorno de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt echo `date` >> /tmp/logbackup.txt done < /mnt/hd2/backup/dirhome.txt /bin/tar czf homeoutros-`date +%d%m%y`.tar.gz /home --exclude-from=/backup/dirhome.txt /bin/tar czf dirtemp-`date +%d%m%y`.tar.gz /tmp cd /home umount /mnt/hd2 # acrescente seus comandos para desligar, limpar lixeira e etc...
Pode simplificar as linhas de comando acima, estão expandidas para facilitar modificações e entendimento, em lugar do case para converter o dia da semana, pode usar esta linha de comando.
MDIA=$((LANG=pt_BR date '+%A')| cut -c0-3)
Cuidado que esta linha retorna sáb com acento em lugar de sab, portanto precisa ajustar a linha de criação do diretório.
Cuidado com esta linha em script executado no cron, pode pegar idioma diferente.