weekly-backup - backup agendado

Publicado por Pedro Fernandes (última atualização em 12/01/2022)

[ Hits: 1.389 ]

Homepage: https://github.com/PedroF37

Download weekly-backup

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ões atualizadas deste 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


Esconder código-fonte

#!/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
#
###########################################################

Scripts recomendados

Backup de diretórios do sistema Linux

Replicação de arquivos

Backup e envio do arquivo + md5sum para o FTP da escolha do usuário

Configuração de backup com rsync sem senha

Backup incremental com montagem automática e e-mail


  

Comentários
[1] Comentário enviado por sabe nada em 25/12/2021 - 20:19h

Se alguém por acaso usar esta primeira versão do script, saiba que o script está errado. Todos os backups que esta primeira versão faz, são backups completos (FULL).
Já enviei aqui para o site a nova versão que já está corrigida, e caso queiram, a nova versão está lá também no meu github: "https://github.com/PedroF37".

[2] Comentário enviado por maurixnovatrento em 09/01/2022 - 11:38h

Bom script.


___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10 [/code]

[3] Comentário enviado por sabe nada em 11/01/2022 - 15:20h


[2] Comentário enviado por mauricio123 em 09/01/2022 - 11:38h

Bom script.


___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10 [/code]


Obrigado, Mas ATENÇÃO, que se usar esta versão, ela não está correta. Não vai danificar nada, mas simplesmente todos os backups que faz vão ser backups completos.
Já enviei uma versão corrigida aqui para o site, e está lá no github também.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts