weekly-backup - backup agendado
Publicado por Pedro Fernandes (última atualização em 12/01/2022)
[ Hits: 1.684 ]
Homepage: https://github.com/PedroF37
Download 1640474098.weekly-backup (versão 2)
Script usa a ferramenta tar com a opção '-g', ou '--listed-incremental', para fazer 4 backups por mês os quais são:
1 backup completo uma vez no mês.
3 backups diferenciais nas restantes três semana (1 por semana!).
A opção -g do tar, cria um arquivo de snapshot com os metadados dos itens que estão no arquivamento.
Se usarmos sempre o mesmo arquivo como referência, esse arquivo vai sendo atualizado e cria backups incrementais
ao invés de diferenciais.
Mas, se em cada novo backup, copiarmos sempre o arquivo de snapshot original, e usarmos sempre a cópia do original,
então, as diferenças que vão constar, são as diferenças entre 'hoje' e o dia do primeiro backup (o backup completo).
É o que o script faz.
Antes de usar o script, por favor leia o cabeçalho todo do script.
Versão 2 - Enviado por Pedro Fernandes em 25/12/2021
Changelog: Script corrigido e escrito quase do zero, porque a aritmética com as datas (que no script original era o meio de saber se era ou não hora de fazer um backup completo), estava totalmente errada.
O script da forma como estava nunca fazia backup diferencial, fazia sempre backup completo.
Agora script vê se é ou não hora de fazer backup completo, simplesmente contando quantos "DiffBackups..." é que existem na pasta e se existirem 3 ou mais, então o script cria novamente o backup completo e começa do zero.
Download 1640474098.weekly-backup
#!/bin/bash
#
###########################################################
#
# SCRIPT weekly-backup
# AUTOR Pedro Fernandes
# EMAIL pedrobfernandes37@gmail.com
# DATA 17-05-2021
#
# ---------------------------------------------------------
#
# DESCRIÇÃO:
#
# Script para fazer backups semanais, usando a ferramenta
# tar. Scripts serão 1 backup completo (nível 0) por mês,
# e os restantes serão backups diferenciais (nível 1) por
# semana.
#
# ---------------------------------------------------------
#
# FUNCIONAMENTO:
#
# O script usa a opção '-g' do tar, para criar arquivo de
# snapshot, com os metadados dos itens incluidos no backup.
# Se usarmos sempre esse mesmo arquivo como referência o
# tar cria backups incrementais, porque a cada backup esse
# arquivo é atualizado. Mas, se em cada novo backup, nós
# fizermos uma cópia do arquivo original, e usarmos sempre
# uma cópia, então o backup vai conter as diferenças entre
# o dia atual e o dia do primeiro backup (o backup completo)
# É isso que o script faz.
#
# Atenção que script manda muito output, então se for
# por em crons e coisas dessas, não se esqueça de redirecionar
# as saídas e erros ok!!
#
# ---------------------------------------------------------
#
# PROCEDIMENTO:
#
# O script usa três variáveis, cada uma que retorna uma
# data:
#
# -DateBackup -> esta tem a data de 'hoje'
# -NextWeek -> esta tem a data da próxima semana
# -LastMonth -> esta tem a data do próximo mês
#
# **************************************************
#
# Com elas (variáveis) o script faz o seguinte:
#
# 1. Verifica se existe algum arquivo 'FullBackup*.snar'
# (.snar é a extensão do arquivo de snapshot).
#
# 2. Se não houver, o script cria um backup completo (Full)
# e o arquivo de snapshot correspondente. O arquivo chama-se:
# 'FullBackup-${DateBackup}.snar'
#
# 3. Se houver, o script usa a data no nome do arquivo, e
# compara com a data retornada pela variável LastMonth,
# que tem a data do mês passado, e vê se passou um mês
# ou mais.
#
# 4. Se tiver passado, o script cria uma pasta
# onde coloca todos os arquivos .snar e .t[gbx]z, e
# então começa de novo. Ou seja, cria o backup completo
# e seu arquivo de snapshot correspondente.
#
# 5. Se não tiver passado, então o script faz uma cópia
# do arquivo de snapshot original e usa essa cópia para
# fazer o backup diferencial. A cópia chama-se:
# 'DiffBackup-${DateBackup}-to-${NextWeek}.snar'
#
# ---------------------------------------------------------
#
# NOTAS:
#
# O script usa três variáveis que é para você configurar:
#
# 1. Compact - nesta variável, você diz se quer usar
# gzip, bzip, ou xz. São estes mesmos nomes,
# ou seja, você não coloca gz em vez de gzip
# nem bzip2 em vez de bzip. O script usa o
# case para ver qual está configurado mas, não
# fiz 'or' nenhum do tipo 'gzip | gz)', então se
# não tiver estes nomes vai dar erro.
#
# 2. BackupDestiny - nesta você especifica o diretório
# para os backups. (Caminho Absoluto)
# Você tem que criar o diretório ok?
# O script não cria para você!!
# Exemplo:
#
# BackupDestiny=/archive/pedro
#
# 3. ConfigFile - nesta você coloca o nome do arquivo com
# os itens para backup. O arquivo você põe
# o caminho absoluto e os itens para backup
# a mesma coisa. Exemplo:
#
# ConfigFile=/home/pedro/BackupList.txt
#
# Formato do arquivo:
#
# /home/pedro/Documentos
# /home/pedro/MEGAsync
# etc etc..
#
###########################################################
#
##### PARÂMETROS
#
### Você configura aqui
#
Compact=
ConfigFile=
BackupDestiny=
#
### Daqui em diante não precisa
### mexer mais ok?
#
DateBackup=$(date +%d-%m-%Y)
NextWeek=$(date -d "next week" +%d-%m-%Y)
LastMonth=$(date -d "last month" +%d-%m-%Y)
FullSnapshot=FullBackup-${DateBackup}.snar
DiffSnapshot=DiffBackup-${DateBackup}-to-${NextWeek}.snar
#
###########################################################
#
##### FUNÇÃO PARA MENSAGENS DE ERRO
#
function ErrorExit {
#
echo
echo "$@" >&2
echo Terminando script... >&2
exit 1
}
#
###########################################################
#
##### VERIFICAÇÕES
#
# Verificamos por existência de diretório, arquivo de
# configuração, permissões, etc...
#
[ -z "$BackupDestiny" ] && {
ErrorExit 'Não especificou pasta de destino dos backups.'
}
#
[ ! -d "$BackupDestiny" ] && {
ErrorExit "Pasta $BackupDestiny não existe."
}
#
[ ! -r "$BackupDestiny" ] || [ ! -w "$BackupDestiny" ] || [ ! -x "$BackupDestiny" ] && {
ErrorExit "Precisa de ter permissão para a pasta $BackupDestiny"
}
#
[ -z "$ConfigFile" ] && {
ErrorExit 'Não especificou arquivo com lista de itens para fazer backup.'
}
#
[ ! -f "$ConfigFile" ] && {
ErrorExit "$ConfigFile não existe ou não e arquivo regular."
}
#
[ ! -r "$ConfigFile" ] || [ ! -s "$ConfigFile" ] && {
ErrorExit "Não tem permissão de leitura para $ConfigFile ou arquivo está vazio."
}
#
if [ -z "$Compact" ]
then
ErrorExit "Não especificou o método de compactação"
else
case $Compact in
#
gzip)
Comp=-czf
OutFullArchive=FullBackup-${DateBackup}.tgz
OutDiffArchive=DiffBackup-${DateBackup}.tgz
;;
bzip)
Comp=-cjf
OutFullArchive=FullBackup-${DateBackup}.tbz
OutDiffArchive=DiffBackup-${DateBackup}.tbz
;;
xz)
Comp=-cJf
OutFullArchive=FullBackup-${DateBackup}.txz
OutDiffArchive=DiffBackup-${DateBackup}.txz
;;
*)
ErrorExit "Input Inválido"
#
esac
fi
#
###########################################################
#
##### LISTA DE ITENS PARA BACKUP
#
echo Compondo lista de itens para backup.
#
# Lê o arquivo de configuração. Entada padrão é
# ConfigFile. Line, vai guardando as linhas lidas
# até ao momento, para falar em que linha está
# o item inexistente, ou, o item ao qual usuário
# não tem permissão.
#
exec 3<&0
exec 0<$ConfigFile
Line=1
read Item
#
while [ $? -eq 0 ]
do
if [ -f "$Item" ] || [ -d "$Item" ]
then
#
# Vemos se tem permissão. Ou é dono
# ou é root. Se tiver permissão ok,
# se não, saímos do script.
#
if [ -O "$Item" ] || [ $UID -eq 0 ]
then
:
else
echo
echo '############################################################'
echo
echo Você não tem permissão para Item ${Item##*/} >&2
echo especificado na linha $Line de ${ConfigFile##*/} >&2
echo Terminando script... >&2
echo
echo '###########################################################'
exit 1
fi
#
# Juntamos itens em lista.
#
BackupList="$BackupList $Item"
else
#
# Se não existir o Item, simplesmente
# avisamos sem sair com erro. Usuário
# pode ter deletado arquivo/diretório e
# simplesmente esqueceu de atualizar
# ConfigFile.
#
echo
echo '##############################################################'
echo
echo O Item ${Item##*/} não existe.
echo Está especificado na linha $Line de ${ConfigFile##*/}.
echo Não iremos incluir no backup. Prosseguindo...
echo
echo '##############################################################'
fi
#
Line=$(($Line + 1))
read Item
done
exec 0<&3
#
echo
echo Composição de lista concluída.
echo
#
###########################################################
#
##### BACKUP
#
# Primeiro tentamos entrar em diretório
#
cd $BackupDestiny || {
ErrorExit "Não conseguimos entrar em $BackupDestiny"
}
#
# OK? Vamos ver se tem arquivo de snapshot. Se não
# tiver, criamos um Full. Se tiver, temos que descobrir
# se já passou um mês ou não. Se tiver passado um mês,
# criamos pasta para armazenar o backup full e os
# diferenciais e então começamos tudo de novo.
# Criamos o backup Full e o snapshot Full, na semana
# seguinte cria os diferenciais etc etc.
#
Match=$(ls FullBackup*.snar 2> /dev/null)
#
if [ -z "$Match" ]
then
echo
echo Iniciando backup...
tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null
else
#
Expired=$(echo "$LastMonth" | sed 's/-//g')
OutOfDate=$(echo "$Match" | cut -d '-' -f 2-4 | \
cut -d '.' -f 1 | sed 's/-//g')
#
if [ "$Expired" -ge "$OutOfDate" ]
then
mkdir Backup-$LastMonth
mv *.snar *.t[gbx]z Backup-$LastMonth
echo
echo Iniciando backup...
tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null
else
cp "$FullSnapshot" "$DiffSnapshot"
echo
echo Iniciando backup...
tar -g $DiffSnapshot $Comp $OutDiffArchive $BackupList 2> /dev/null
fi
fi
#
echo Backup concluido....
echo Terminando script...
exit 0
#
###########################################################
Enviando e-mail localmente após o backup para monitoramento
Backup Ubiquiti com usuários e senhas SSH diferentes
Backup de diretórios do sistema Linux
Script para gravação de BKPs em DVDs-RW
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









