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

TolikCorp

Участник
Сообщения
874
Реакции
334
Резервные копии серверов занимают много пространства? Данный скрипт поможет решить этот вопрос.
Резервирование данных происходит по следующей схеме: смотрится каталог с дистрибутивом, далее в лист для архивирования попадают только те файлы, которых нет в дистрибутиве, либо отличается md5 сумма.
################################################################################################
PHP:
#!/bin/bash
    if [ -z ${1} ]; then
        echo "[---] Ошибка: Первый аргумент - это каталог-дистрибутив."
        exit 1
    fi
    if [ -z ${2} ]; then
        echo "[---] Ошибка: Второй аргумент - это каталог-сервер."
        exit 1
    fi
    if [ -z ${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 [[ ! -d "${backup_source_location}" ]]; then
        echo "[---] Ошибка: ${backup_source_location} - это не каталог"
        exit 1
    fi
    if [[ ! -d "${backup_target_location}" ]]; then
        echo "[---] Ошибка: ${backup_target_location} - это не каталог"
        exit 1
    fi
    if [[ ! -d "${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 [ -n "${pids_list}" ]; then
        echo -n "[---] Внимание: Найдено незавершенное резервирование данных. Завершение..."
        kill -9 ${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 [[ ! -d "${backup_source_location}" ]]; then
        echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
        exit 1
    fi
    if [[ ! -d "${backup_target_location}" ]]; then
        echo "[---] Ошибка: Каталог ${backup_target_location} отсутствует."
        exit 1
    fi
    cd ${backup_source_location}
    if [ -f "${backup_source_list}" ]; then
        echo -n "[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_source_list}). Удаление..."
        rm -- "${backup_source_list}"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    if [ -f "${backup_target_list}" ]; then
        echo -n "[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_target_list}). Удаление..."
        rm -- "${backup_target_list}"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    echo -n "[---] Подготовка списка файлов (${backup_source_list})..."
    find . -type f -print | sed -e 's/^.\{1\}//' > ${backup_source_list}
    if [ "$?" -eq 0 ]; then
        echo " OK"
    else
        echo " FAIL ($?)"
        exit 1
    fi
    echo -n "[---] Подготовка списка файлов (${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 [ -f "${backup_target_list}.backup.part1" ]; then
        echo -n "[---] Внимание: Найден временный файл от предыдущего резервирования данных (${backup_target_list}.backup.part1). Удаление..."
        rm -- "${backup_target_list}.backup.part1"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    if [ -f "${backup_target_list}.backup.part2" ]; then
        echo -n "[---] Внимание: Найден временный файл от предыдущего резервирования данных (${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 -v ^# $backup_source_list); do
        if [ -f "${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 -v ${i} ${backup_target_list}.backup.part1 > ${backup_target_list}.backup.part2
                    index="1"
                else
                    grep -v ${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 -v ${i} ${backup_target_list}.backup.part1 > ${backup_target_list}.backup.part2
            index="1"
        else
            grep -v ${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 [ -f "${backup_target_list}" ]; then
        echo -n "[---] Внимание: Найден временный файл от резервирования данных (${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 [ -f "${backup_target_list}.backup.part1" ]; then
        echo -n "[---] Внимание: Найден временный файл от резервирования данных (${backup_target_list}.backup.part1). Удаление..."
        rm -- "${backup_target_list}.backup.part1"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    if [ -f "${backup_target_list}.backup.part2" ]; then
        echo -n "[---] Внимание: Найден временный файл от резервирования данных (${backup_target_list}.backup.part2). Удаление..."
        rm -- "${backup_target_list}.backup.part2"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    if [ -f "${backup_source_list}" ]; then
        echo -n "[---] Внимание: Найден временный файл от резервирования данных (${backup_source_list}). Удаление..."
        rm -- "${backup_source_list}"
        if [ "$?" -eq 0 ]; then
            echo " OK"
        else
            echo " FAIL ($?)"
        fi
    fi
    echo -n "[---] Подготовка к резервации данных завершена. Процесс резервации данных будет запущен в окне (${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 [ -n "${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
 
Последнее редактирование:

BMW M6

Участник
Сообщения
1,217
Реакции
534
Очень хороший скрипт.
Все мои игровые сервера весят - 68 гигабайт.
Папка с backup'оп всех серверов весит - 7,2 гига.
---
Скрипт отличный, для еженедельных backup'ов рекомендую.
f361b5794b7e.png
 

TolikCorp

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

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Оффтоп
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Оффтоп

Добавлено через 6 минут
По существу
if [[ ! -d "${backup_source_location}" ]]; then
echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
exit 1
fi
if [[ ! -d "${backup_source_location}" ]]; then
echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
exit 1
fi
Тут дважды одно и то же.
 
Последнее редактирование:

TolikCorp

Участник
Сообщения
874
Реакции
334
Исправил.
PHP:
    if [[ ! -d "${backup_source_location}" ]]; then
        echo "[---] Ошибка: Каталог ${backup_source_location} отсутствует."
        exit 1
    fi
    if [[ ! -d "${backup_target_location}" ]]; then
        echo "[---] Ошибка: Каталог ${backup_target_location} отсутствует."
        exit 1
    fi
Обновил на GitHub
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Это что же получается, надо отдельно содержать чистый каталог с серверными файлами помимо каталогов серверов?
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Отредактировал первое сообщение: оформил, разместил актуальный текст скрипта, привел статистику, краткая инструкция по установке.
 
Сверху Снизу