Страниц: 1
Прошу помощи в отладке скрипта для резервного копирования данных на моем сервере. Основная задача - резервное копирование документов компании, расположенных в расшареной папке на другом сервере (там стоит 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 был вторым
).
Дополнительные данные на которые ссылается скрипт -
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 часов и прибил ![]()
Отредактированно alex2ndr (23-06-2008 04:30:35)
Неактивен
Посмотрел.
Для начала я бы посоветовал следующее:
- Вынести функцию Del_old_files наверх
- присвоить всем параметрам функции имена. Вы это сделали только для одного.
. Оптимизировать ее, заменив цикл по дням на что-нибудь типа ls -t $location/ | tail -1
. Убрать наконец установку PATH. Что у Вас там за линух, что у него в PATH нет нужных вещей?
. Убрать установку NAME, название скрипта можно получить так: `basename $0`
- Вынести константы типа этой: MAX_BKP_SIZE=31457280 наверх
- Имена переменных должны отличаться от констант. Я обычно делаю имена переменных в нижнем регистре
- USER, GROUP и HOME нигде не используются. И вообще вредно юзернеймы писать вовнутрь скрипта. Ваш последователь не обрадуется, когда нужно будет лазить везде и исправлять alex на vasja, а зачем вам плохая карма ![]()
- Вместо FREE_SPACE=`/bin/df -k | grep "$BKP_PLACE" | awk '{print $3}' | sed -n 1p` лучше использовать `df -k /dev/sda1 | tail -1 | awk '{print $4}'` или stat.
Пока все, мне нужен отдых ![]()
Продолжим на исправленной версии, если захотите.
PS: Если это просто для тренировки, то это нормально, но вообще-то я бы предложил попользовать какое-нибудь готовое решение, желательно на основе rsync-а. Сэкономили бы массу места вместо того, чтобы копировать одно и тоже какждый день ![]()
Неактивен
Спасибо
- насчет tail -1 сам как то не додумался. Изобрел цикл по дням - причем он заметно тормозит выполнение Спасибо еще раз
- насчет PATH - ну я думаю что скрипт пишу не только для себя и к тому же планирую переносить его с машины на машину - а path по умолчанию для пользователя не содержит /sbin и /usr/sbin - а мне как то не хочется проверять каждую из используемых команд на то где она находиться (ну лентяй я
)
- присвоить всем параметрам функции имена. Вы это сделали только для одного.
это про что? непонял
- Насчет USER, GROUP и HOME - скопировал из какого то скрипта - показалось хорошим тоном - там они тоже не использовались
- Насчет имен переменных и констант и $0 - да - теперь в Advanced Bash-Scripting Guide я про это прочел
- насчет MAX_BKP_SIZE - это не константа а прикидочное значение - планирую потом заменить на команду которая будет оценивать размер документов перед копированием.
- насчет места - выбил под эти архивы терабайт raid 1
Все исправлю - дайте только время - сейчас же рабочая неделя - хоть сервер и на работе - но скрипты пишу в свободное от нее время ![]()
Насчет rsync - перед тем как начать эту бодягу долго искал на чем же таком разворачиваться - пришел к выводу что tar лучше всего для моих целей (но может недостаточно глубоко копал) - ведь мне хотелось бы иметь независимые копии архивов за как можно больший срок - это документы нашего КБ и ошибка может всплыть и через месяц другой - т е понадобиться старая копия файла.(а файлов на 20-25 Гб) Но если у Вас есть какие то аргументы за чтонить еще - приведите пожалуйста. Насчет готового решения - да вы правы - в какой то степени это тренировка - совмещаю приятное (изучение шелл) с полезным (копированием документов).
Неактивен
alex2ndr говорит:
- насчет PATH - ну я думаю что скрипт пишу не только для себя и к тому же планирую переносить его с машины на машину - а path по умолчанию для пользователя не содержит /sbin и /usr/sbin - а мне как то не хочется проверять каждую из используемых команд на то где она находиться (ну лентяй я
)
Зачем проверять? Девелопить нужно от юзера. А то, что лежит в /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
Это то, что в голову пришло, тулзов таких должно быть много.
Неактивен
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Мб) и следить за местом на харде напряжно (лень просто) - и думаю большинство программ не имеет такой фичи - насчет экономии места еще разбираюсь.
Спасибо за помощь
Неактивен
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, с хранением только разницы(читайте изменений за день) вы может до этого момента и не доживете
А если решите воспользоваться файловой системой с компрессией, то может и ваши дети тоже ![]()
Неактивен
Страниц: 1