1 Отредактировано alex2ndr (23-06-2008 14:30:35)

Тема: Скрипт резервного копирования данных - помогите оптимизировать

Прошу помощи в отладке скрипта для резервного копирования данных на моем сервере. Основная задача - резервное копирование документов компании, расположенных в расшареной папке на другом сервере (там стоит W2k3). Данное резервное копирование должно защищать не столько от сбоев оборудования сколько от действий неграмотных пользователей (типа - Ой, я тут свою папку удалил - восстановите пожалуйста  - и ладно бы в тот же день - так возможно что попросят и через месяц). Работать он должен следующим образом - копируте документы с расшареной  папки (/mnt/server-docum), архивирует, затем складывает к себе на хард (в /backup) и в другую подмонтированную папку на первом сервере(/mnt/server-bkp/Documents/). Попутно требуется сообщать о действия или ошибках. Первая версия скрипта такая -

#!/bin/sh
#
# Script for backup and restore user's inverenment
# Author: Popov Alexandr

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=backup_docum.sh
USER=alex
GROUP=alex
HOME=/home/alex/
DESC="Backup and copy Documents files"

case "$1" in
backup)
        Del_old_files ()
        {
        # Deleting oldest backup files
        freesp=$1
        while [ "$freesp" -lt "$2" ]
        do
                DAY_COUNT=300
                for i in `seq 1 $DAY_COUNT`
                do
                        let "j = $DAY_COUNT - $i"
                        OLDEST_FILE=`find $3/ -name "docum*" -atime +$j | sed -n 1p`
                        if [ -n "$OLDEST_FILE" ]
                        then
                                break
                        fi
                done
                rm -f $OLDEST_FILE
                echo "Free Space in $3 less than $2 at `date +%F` - Del file $OLDEST_FILE" >> /home/alex/log_bkp.txt
                freesp=`/bin/df -k | grep "$3" | awk '{print $3}' | sed -n 1p`
        done
        }

        mount -a
        # Create backup of user settings
        BKPFILE="docum-`date +%F`.tar"

        # Hom many free space in our directory
        BKP_PLACE="/backup"
        FREE_SPACE=`/bin/df -k | grep "$BKP_PLACE" | awk '{print $3}' | sed -n 1p`
        MAX_BKP_SIZE=31457280

        Del_old_files $FREE_SPACE $MAX_BKP_SIZE $BKP_PLACE

        #Creating archive
        tar -cvf /backup/$BKPFILE /mnt/server-docum &&
        echo "taring sucess `date +%F`" >> /home/alex/log_bkp.txt &&

        # Hom many free space in our directory
        BKP_PLACE="/mnt/server-bkp"
        FREE_SPACE=`/bin/df -k | grep "$BKP_PLACE" | awk '{print $3}' | sed -n 1p`

        Del_old_files $FREE_SPACE $MAX_BKP_SIZE $BKP_PLACE

        cp /backup/$BKPFILE /mnt/server-bkp/Documents/ &&
        echo "copyng sucess `date +%F`" >> /home/alex/log_bkp.txt
        ;;
restore)

        ;;
*)
        printf "Usage: $NAME {backup|restore}\n" >&2
        exit 1
        ;;
esac
exit 0

Просьба сразу не пинать - это вообще мой первый нормальный скрипт (скрипт в теме  Проблема с именем файлов в FBReader был вторым smile).
Дополнительные данные на которые ссылается скрипт -

alex@debian-gate:~$ df -k
Файловая система     1K-блоков      Исп  Доступно  Исп% смонтирована на
/dev/mapper/vg0-root  40958744  17848796  23109948  44% /
tmpfs                  1026092         0   1026092   0% /lib/init/rw
udev                     10240        60     10180   1% /dev
tmpfs                  1026092         0   1026092   0% /dev/shm
/dev/mapper/vg0-backup
                     197790980    191952 187551748   1% /backup
/dev/md0                233225     13498    207686   7% /boot
//192.168.0.2/Documents
                     358402084  64907756 293494328  19% /mnt/server-docum
//192.168.0.2/Backup 745102700 379259832 365842868  51% /mnt/server-bkp
alex@debian-gate:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/mapper/vg0-root /               reiserfs defaults        0       1
/dev/mapper/vg0-backup /backup         ext3    defaults        0       2
/dev/md0        /boot           ext3    defaults        0       2
/dev/mapper/vg0-swap none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

//192.168.0.2/Documents /mnt/server-docum/      cifs    defaults,username=samba-bkp,password=****,file_mode=0777,dir_mode=0777,iochars           et=utf8,ro      0       0

//192.168.0.2/Backup    /mnt/server-bkp/        cifs    defaults,username=samba-bkp,password=****,file_mode=0777,dir_mode=0777,iochars           et=utf8 0       0

Далее этот скрипт засунут в крон и выполняется каждую ночь.
Есть проблема которую не знаю как побороть - при распаковке этого архива в виндах имена файлов выглядят кракозябликами.

Всем спасибо - если забыл выложить еще какую нить инфу - говорите - выложу.

PS Это вторая версия скрипта - а в первой был бесконечный цикл в функции Del_old_files, так как я забыл обновлять переменную freesp в конце каждого цикла - хорошо заметил всего лишь через 12 часов и прибил smile

Nokia N800 OS 5.2008.43-7 / Nokia 3110 Classic / Debian 5.0.0 Lenny

2

Re: Скрипт резервного копирования данных - помогите оптимизировать

Посмотрел.
Для начала я бы посоветовал следующее:
- Вынести функцию Del_old_files наверх
- присвоить всем параметрам функции имена. Вы это сделали только для одного.
. Оптимизировать ее, заменив цикл по дням на что-нибудь типа ls -t $location/ | tail -1
. Убрать наконец установку PATH. Что у Вас там за линух, что у него в PATH нет нужных вещей?
. Убрать установку NAME, название скрипта можно получить так: `basename $0`
- Вынести константы типа этой: MAX_BKP_SIZE=31457280 наверх
- Имена переменных должны отличаться от констант. Я обычно делаю имена переменных в нижнем регистре
- USER, GROUP и HOME нигде не используются. И вообще вредно юзернеймы писать вовнутрь скрипта. Ваш последователь не обрадуется, когда нужно будет лазить везде и исправлять alex на vasja, а зачем вам плохая карма smile
- Вместо FREE_SPACE=`/bin/df -k | grep "$BKP_PLACE" | awk '{print $3}' | sed -n 1p` лучше использовать `df -k /dev/sda1 | tail -1 | awk '{print $4}'` или stat.

Пока все, мне нужен отдых smile
Продолжим на исправленной версии, если захотите.

PS: Если это просто для тренировки, то это нормально, но вообще-то я бы предложил попользовать какое-нибудь готовое решение, желательно на основе rsync-а. Сэкономили бы массу места вместо того, чтобы копировать одно и тоже какждый день smile

770/800/810/900

3

Re: Скрипт резервного копирования данных - помогите оптимизировать

Спасибо
- насчет tail -1 сам как то не додумался. Изобрел цикл по дням - причем он заметно тормозит выполнение Спасибо  еще раз
- насчет PATH - ну я думаю что скрипт пишу не только для себя и к тому же планирую переносить его с машины на машину - а path по умолчанию для пользователя не содержит /sbin и /usr/sbin - а мне как то не хочется проверять каждую из используемых команд на то где она находиться (ну лентяй я smile )

- присвоить всем параметрам функции имена. Вы это сделали только для одного.

это про что? непонял
- Насчет USER, GROUP и HOME - скопировал из какого то скрипта - показалось хорошим тоном - там они тоже не использовались
- Насчет имен переменных и констант и $0 - да - теперь в Advanced Bash-Scripting Guide я про это прочел
- насчет MAX_BKP_SIZE - это не константа а прикидочное значение - планирую потом заменить на команду которая будет оценивать размер документов перед копированием.
- насчет места - выбил под эти архивы терабайт raid 1

Все исправлю - дайте только время - сейчас же рабочая неделя - хоть сервер и на работе - но скрипты пишу в свободное от нее время smile

Насчет rsync - перед тем как начать эту бодягу долго искал на чем же таком разворачиваться - пришел к выводу что tar лучше всего для моих целей (но может недостаточно глубоко копал) - ведь мне хотелось бы иметь независимые копии архивов за как можно больший срок - это документы нашего КБ и ошибка может всплыть и через месяц другой - т е понадобиться старая копия файла.(а файлов на 20-25 Гб) Но если у Вас есть какие то аргументы за чтонить еще - приведите пожалуйста. Насчет готового решения - да вы правы - в какой то степени это тренировка - совмещаю приятное (изучение шелл) с полезным (копированием документов).

Nokia N800 OS 5.2008.43-7 / Nokia 3110 Classic / Debian 5.0.0 Lenny

4

Re: Скрипт резервного копирования данных - помогите оптимизировать

alex2ndr пишет:

- насчет PATH - ну я думаю что скрипт пишу не только для себя и к тому же планирую переносить его с машины на машину - а path по умолчанию для пользователя не содержит /sbin и /usr/sbin - а мне как то не хочется проверять каждую из используемых команд на то где она находиться (ну лентяй я smile )

Зачем проверять? Девелопить нужно от юзера. А то, что лежит в /sbin не зря туда положено и звать его нужно оттуда.

- присвоить всем параметрам функции имена. Вы это сделали только для одного.

это про что? непонял

Это про это: freesp=$1, а дальше в теле оперируете $2 и $3. Лучше будет скажем так:

freesp=$1
maxsize=$2
location=$3

и в теле функции использовать только переменные. Более читабельно, да и вообще так правильнее.

- насчет места - выбил под эти архивы терабайт raid 1

Его никогда много не бывает.

Насчет rsync - перед тем как начать эту бодягу долго искал на чем же таком разворачиваться

Откройте для себя скажем RsyncBackup: http://www.owlfish.com/software/utils/RSyncBackup/, Rdiff-backup: http://www.nongnu.org/rdiff-backup/, Duplicity: http://www.nongnu.org/duplicity/index.html Это то, что в голову пришло, тулзов таких должно быть много.

770/800/810/900

5

Re: Скрипт резервного копирования данных - помогите оптимизировать

2 Wall
Скрипт потихоньку правлю - но выложить пока не готов(некогда)
По поводу других названных программ
- RsyncBackup - ну если эта страница вся документация - http://www.owlfish.com/software/utils/R … p/api.html - то тогда она очень бедная по возможностям - другой нормальной доки пока не нашел
- Rdiff-backup и Duplicity гораздо более интересны - но как я понял(проситав man'ы) у них нет одной нужной мне фичи - они удаляют старые архивы по мере устаревания (--remove-older-than time_spec - типа больше 30 дней - удалить) - а я хочу по мере заполнения харда (не хватает места сделать бэкап - удалять старые пока место не появиться) , так как размер документов динамично изменяется(каждый день +-100-200Мб) и следить за местом на харде напряжно (лень просто) - и думаю большинство программ не имеет такой фичи - насчет экономии места еще разбираюсь.
Спасибо за помощь

Nokia N800 OS 5.2008.43-7 / Nokia 3110 Classic / Debian 5.0.0 Lenny

6

Re: Скрипт резервного копирования данных - помогите оптимизировать

alex2ndr пишет:

По поводу других названных программ
- RsyncBackup - ну если эта страница вся документация - http://www.owlfish.com/software/utils/R … p/api.html - то тогда она очень бедная по возможностям - другой нормальной доки пока не нашел

Я ткнул в первое попавшееся. ни одну тулзу я не смотрел и не знаю как оно работает. Знаю только, что ваша задача - стандартный бэкап и реализаций должно быть море. Если вы считаете, что это нигде не сделано и лучше написать скрипт в 20 строчек, то вы глубоко заблуждаетесь. Этот велосипед уже давно придумали.

- Rdiff-backup и Duplicity гораздо более интересны - но как я понял(проситав man'ы) у них нет одной нужной мне фичи - они удаляют старые архивы по мере устаревания (--remove-older-than time_spec - типа больше 30 дней - удалить) - а я хочу по мере заполнения харда (не хватает места сделать бэкап - удалять старые пока место не появиться) , так как размер документов динамично изменяется(каждый день +-100-200Мб) и следить за местом на харде напряжно (лень просто) - и думаю большинство программ не имеет такой фичи - насчет экономии места еще разбираюсь.

Ну вы как маленький, ей богу. Хотите удалить последнее - посмотрите что у вас есть и сколько ему лет, месяцев и дней и удалите, пользуясь --remove-older-than. Это же обычная арифметика. Но имея терабайт места и бэкап основаный на rsync, с хранением только разницы(читайте изменений за день) вы может до этого момента и не доживете smile А если решите воспользоваться файловой системой с компрессией, то может и ваши дети тоже smile

770/800/810/900

7

Re: Скрипт резервного копирования данных - помогите оптимизировать

дайте плиз финальную версию скрипта