[СКРИПТ] BackUp на основе сравнений

Тема в разделе "Linux", создана пользователем TolikCorp, 30 апр 2014.

  1. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Резервные копии серверов занимают много пространства? Данный скрипт поможет решить этот вопрос.
    Резервирование данных происходит по следующей схеме: смотрится каталог с дистрибутивом, далее в лист для архивирования попадают только те файлы, которых нет в дистрибутиве, либо отличается md5 сумма.
    ################################################################################################
    PHP:
    #!/bin/bash
        
    if [ -${1} ]; then
            
    echo "[---] Ошибка: Первый аргумент - это каталог-дистрибутив."
            
    exit 1
        fi
        
    if [ -${2} ]; then
            
    echo "[---] Ошибка: Второй аргумент - это каталог-сервер."
            
    exit 1
        fi
        
    if [ -${3} ]; then
            
    echo "[---] Ошибка: Третий аргумент - это каталог-backup."
            
    exit 1
        fi
        
    if [[ "$(echo ${1} | tail -c 2)" == "/" ]]; then
            backup_source_location
    ="$(echo ${1} | sed s'/.$//')"
        
    else
            
    backup_source_location="${1}"
        
    fi
        
    if [[ "$(echo ${2} | tail -c 2)" == "/" ]]; then
            backup_target_location
    ="$(echo ${2} | sed s'/.$//')"
        
    else
            
    backup_target_location="${2}"
        
    fi
        
    if [[ "$(echo ${3} | tail -c 2)" == "/" ]]; then
            backup_backup_target_location
    ="$(echo ${3} | sed s'/.$//')"
        
    else
            
    backup_backup_target_location="${3}"
        
    fi
        
    if [[ ! -"${backup_source_location}]]; then
            
    echo "[---] Ошибка: ${backup_source_location} - это не каталог"
            
    exit 1
        fi
        
    if [[ ! -"${backup_target_location}]]; then
            
    echo "[---] Ошибка: ${backup_target_location} - это не каталог"
            
    exit 1
        fi
        
    if [[ ! -"${backup_backup_target_location}]]; then
            
    echo "[---] Ошибка: ${backup_backup_target_location} - это не каталог"
            
    exit 1
        fi
        backup_source_list
    ="${backup_target_location}/source.list"
        
    backup_target_list="${backup_target_location}/target.list"
        
    backup_title=`echo -n ${backup_source_location} | sed 's|.*/||';echo -n _;echo ${backup_target_location} | sed 's|.*/||';`
        
    pids_list="$(ps ax | grep SCREEN | grep -v grep | grep ${backup_title}_backup | awk '{print $1}')"
        
    if [ -"${pids_list}]; then
            
    echo -"[---] Внимание: Найдено незавершенное резервирование данных. Завершение..."
            
    kill -${pids_list}
            if [ 
    "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
            screen 
    -wipe > /dev/null 2>&1
        fi
        
    if [[ "${backup_source_location}== "${backup_target_location}]]; then
            
    echo "[---] Ошибка: Каталог-дистрибутив не должен совпадать с каталогом-назначением."
            
    exit 1
        fi
        
    if [[ ! -"${backup_source_location}]]; then
            
    echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
            
    exit 1
        fi
        
    if [[ ! -"${backup_target_location}]]; then
            
    echo "[---] Ошибка: Каталог ${backup_target_location} отсутствует."
            
    exit 1
        fi
        cd 
    ${backup_source_location}
        if [ -
    "${backup_source_list}]; then
            
    echo -"[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_source_list}). Удаление..."
            
    rm -- "${backup_source_list}"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    if [ -"${backup_target_list}]; then
            
    echo -"[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_target_list}). Удаление..."
            
    rm -- "${backup_target_list}"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    echo -"[---] Подготовка списка файлов (${backup_source_list})..."
        
    find . -type f -print | sed -'s/^.\{1\}//' > ${backup_source_list}
        if [ 
    "$?" -eq 0 ]; then
            
    echo " OK"
        
    else
            echo 
    " FAIL ($?)"
            
    exit 1
        fi
        
    echo -"[---] Подготовка списка файлов (${backup_target_list})..."
        
    find ${backup_target_location} -type f -print > ${backup_target_list}
        if [ 
    "$?" -eq 0 ]; then
            
    echo " OK"
        
    else
            echo 
    " FAIL ($?)"
            
    exit 1
        fi
        
    if [ -"${backup_target_list}.backup.part1" ]; then
            
    echo -"[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_target_list}.backup.part1). Удаление..."
            
    rm -- "${backup_target_list}.backup.part1"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    if [ -"${backup_target_list}.backup.part2" ]; then
            
    echo -"[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_target_list}.backup.part2). Удаление..."
            
    rm -- "${backup_target_list}.backup.part2"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        cp 
    -- "${backup_target_list}" "${backup_target_list}.backup.part1"
        
    index="0"
        
    for i in $(grep -^# $backup_source_list); do
            
    if [ -"${backup_target_location}${i}]; then
                
    if [ "$(md5sum ${backup_target_location}${i} | awk '{ print $1 }')" == "$(md5sum ${backup_source_location}${i} | awk '{ print $1 }')" ]; then
                    
    if [ "${index}-eq "0" ]; then
                        grep 
    -${i} ${backup_target_list}.backup.part1 > ${backup_target_list}.backup.part2
                        index
    ="1"
                    
    else
                        
    grep -${i} ${backup_target_list}.backup.part2 > ${backup_target_list}.backup.part1
                        index
    ="0"
                    
    fi
                    
    echo "${i} идентичен оригиналу"
                
    else
                    echo 
    "${i} не идентичен оригиналу"
                
    fi
            
    else
                echo 
    "${i} не существует"
            
    fi
        done
        backup_temp_list
    =".backup.tar.gz .backup.part1 .backup.part2 source.list"
        
    for i in ${backup_temp_list}; do
            if [ 
    "${index}-eq "0" ]; then
                grep 
    -${i} ${backup_target_list}.backup.part1 > ${backup_target_list}.backup.part2
                index
    ="1"
            
    else
                
    grep -${i} ${backup_target_list}.backup.part2 > ${backup_target_list}.backup.part1
                index
    ="0"
            
    fi
        done
        
    if [ "${index}-eq "0" ]; then
            backup_target_file
    ="${backup_target_list}.backup.part1"
        
    else
            
    backup_target_file="${backup_target_list}.backup.part2"
        
    fi
        
    echo "[---] Обработка файлов завершена. Подготовка к резервации данных..."
        
    if [ -"${backup_target_list}]; then
            
    echo -"[---] Внимание: Найден временный файл от резервирования данных (${backup_target_list}). Удаление..."
            
    rm -- "${backup_target_list}"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        cp 
    -- "${backup_target_file}" "${backup_target_list}"
        
    if [ "$?" -eq 0 ]; then
            
    echo "[---] Лист файлов для резервирования (${backup_target_list}) подготовлен."
        
    else
            echo 
    "[---] Ошибка: Лист файлов для резервирования (${backup_target_list}) не был подготовлен."
            
    exit 1
        fi
        
    if [ -"${backup_target_list}.backup.part1" ]; then
            
    echo -"[---] Внимание: Найден временный файл от резервирования данных (${backup_target_list}.backup.part1). Удаление..."
            
    rm -- "${backup_target_list}.backup.part1"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    if [ -"${backup_target_list}.backup.part2" ]; then
            
    echo -"[---] Внимание: Найден временный файл от резервирования данных (${backup_target_list}.backup.part2). Удаление..."
            
    rm -- "${backup_target_list}.backup.part2"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    if [ -"${backup_source_list}]; then
            
    echo -"[---] Внимание: Найден временный файл от резервирования данных (${backup_source_list}). Удаление..."
            
    rm -- "${backup_source_list}"
            
    if [ "$?" -eq 0 ]; then
                
    echo " OK"
            
    else
                echo 
    " FAIL ($?)"
            
    fi
        fi
        
    echo -"[---] Подготовка к резервации данных завершена. Процесс резервации данных будет запущен в окне (${backup_title}_backup). Запуск..."
        
    screen -AmdS ${backup_title}_backup tar -zcf ${backup_backup_target_location}/$(date +%F)_${backup_title}.backup.tar.gz --files-from ${backup_target_list}
        if [ 
    "$?" -eq 0 ]; then
            
    echo " OK"
        
    else
            echo 
    " FAIL ($?)"
        
    fi
        backup_tar_screen_pid
    =`screen -list | grep ${backup_title}_backup | cut -f1 -d'.' | sed 's/\W//g'`
        if [ -
    "${backup_tar_screen_pid}]; then
            
    echo "[---] Для просмотра процесса резервации данных введите: screen -r ${backup_tar_screen_pid}"
        
    fi
    #####################################################################################################
    #                                                                                                   #
    #                    #######                         #####                                          #
    #                       #     ####  #      # #    # #     #  ####  #####  #####                     #
    #                       #    #    # #      # #   #  #       #    # #    # #    #                    #
    #                       #    #    # #      # ####   #       #    # #    # #    #                    #
    #                       #    #    # #      # #  #   #       #    # #####  #####                     #
    #                       #    #    # #      # #   #  #     # #    # #   #  #                         #
    #                       #     ####  ###### # #    #  #####   ####  #    # #                         #
    #                                                                                                   #
    #####################################################################################################
    ################################################################################################
    Необходимо:
    1. Сам сервер
    2. Актуальный дистрибутив сервера
    3. Специально организованное место для хранения резервной копии
    ################################################################################################
    Установка:
    1. Перейдите в каталог, где будет расположен сам скрипт резервного копирования
    2. Выполните команду
    PHP:
    wget --no-check-certificate https://raw.githubusercontent.com/TolikCorp/backup_dir/master/backup.bash; chmod +x ./backup.bash
    3. Используя пример запуска, сконфигурируйте планировщик задач
    ################################################################################################
    Пример запуска резервации данных:[/SIZE]
    PHP:
    /home/scripts/backup.txt /home/distrib/232370 /home/user/hl2dm_1 /home/backup
    Первый аргумент: каталог-дистрибутив
    Второй аргумент: каталог-сервер
    Третий документ: каталог-бекап
    ################################################################################################
    Статистика:
    Уменьшение размера резервной копии на 85%, при условии, что на сервере есть пользовательские карты, звуки, модели и другое.
    При отсутствии их, возможно уменьшение размера резервной копии до 99%!
    ################################################################################################
    Отзывы пользователей:
    http://hlmod.ru/forum/showpost.php?p=150294&postcount=2
    ################################################################################################
    GitHub: https://github.com/TolikCorp/backup_dir/raw/master/backup.bash
     
    Последнее редактирование: 9 июл 2014
    zanoza73, Petrovich, Andrey и 2 другим нравится это.
  2. BMW M6

    BMW M6

    Сообщения:
    1.221
    Симпатии:
    569
    Очень хороший скрипт.
    Все мои игровые сервера весят - 68 гигабайт.
    Папка с backup'оп всех серверов весит - 7,2 гига.
    ---
    Скрипт отличный, для еженедельных backup'ов рекомендую.
    [​IMG]
     
    TolikCorp нравится это.
  3. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Обновление:
    + теперь нет необходимости завершать название каталога символом /
    + добавлены всевозможные проверки ( существование каталогов, успешность выполнения операций и т.д. )
    * исправлено название окна screen
    Выполнив команду, указанную ниже, Вы получите самую новую версию скрипта.
    PHP:
    wget --no-check-certificate https://raw.githubusercontent.com/TolikCorp/backup_dir/master/backup.bash; chmod +x ./backup.bash
     
    zanoza73 нравится это.
  4. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Оффтоп
     
    Серый™ нравится это.
  5. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Оффтоп
     
    tiger_by нравится это.
  6. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Оффтоп

    Добавлено через 6 минут
    По существу
    Тут дважды одно и то же.
     
    Последнее редактирование: 29 май 2014
  7. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Исправил.
    PHP:
        if [[ ! -"${backup_source_location}]]; then
            
    echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
            
    exit 1
        fi
        
    if [[ ! -"${backup_target_location}]]; then
            
    echo "[---] Ошибка: Каталог ${backup_target_location} отсутствует."
            
    exit 1
        fi
    Обновил на GitHub
     
  8. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Это что же получается, надо отдельно содержать чистый каталог с серверными файлами помимо каталогов серверов?
     
  9. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
  10. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Отредактировал первое сообщение: оформил, разместил актуальный текст скрипта, привел статистику, краткая инструкция по установке.
     
    BMW M6 нравится это.