LINUX.ORG.RU

Изменить скрипт для быстрого добавления/удаления сайтов.

 


0

1

ТРОЛЛИ МИМО!

Имею скрипт:

#!/bin/bash
Name=site1
BP_name_file=$Name."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name\" запущено..." >>$LOGFILE
OLD_IFS=$IFS
IFS=$'\n'
Source_dir="/var/www/html/drupal/"
TGT_dir="/home/user/backup/"
tar -czf $TGT_dir$BP_name_file $Source_dir &>>$LOGFILE
STATUS=$?
IFS=$OLD_IFS
echo "Finish backup ${srv_name}"

Name1=site2
BP_name_file1=$Name1."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name1\" запущено..." >>$LOGFILE
OLD_IFS=$IFS
IFS=$'\n'
Source_dir1="/var/lib/mysql/wp"
TGT_dir1="/home/user/backup/"
tar -czf $TGT_dir1$BP_name_file1 $Source_dir1 &>>$LOGFILE
STATUS=$?
IFS=$OLD_IFS
echo "Finish backup ${srv_name}"

Name2=site3
BP_name_file2=$Name2."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name2\" запущено..." >>$LOGFILE
OLD_IFS=$IFS
IFS=$'\n'
Source_dir2="/var/lib/mysql/opencart"
TGT_dir2="/home/user/backup/"
tar -czf $TGT_dir2$BP_name_file2 $Source_dir2 &>>$LOGFILE
STATUS=$?
IFS=$OLD_IFS
echo "Finish backup ${srv_name}"
date
# Папка, куда будем складывать архивы
syst_dir=/home/user/backup/
# Имя сервера, который архивируем
srv_name=user
# Адрес сервера, который архивируем
srv_ip=127.0.0.1
# Пользователь rsync на сервере, который архивируем
srv_user=backup
# Ресурс на сервере для бэкапа
srv_dir1="/home/user/backup/{$BP_name_file,$BP_name_file1,$BP_name_file2}"
echo "Start backup ${srv_name}"
# Создаем папку для инкрементных бэкапов
mkdir -p ${syst_dir}${srv_name}/
cd ${syst_dir}${srv_name}/
rm $(ls -t | tail -n +4) -rf
# Запускаем непосредственно бэкап с параметрами
rsync -a --delete-after $srv_name@$srv_ip:$srv_dir1 ${syst_dir}${srv_name}/
date
echo "Finish backup ${srv_name}"

Что нужно изменить в коде?



Последнее исправление: SysError (всего исправлений: 3)

Изминения

Ты б русский сначала освоил.

Что нужно изменить в коде?

То, что тебе нужно.

ТРОЛИ МИМО!

С таким русским, и с такими формулировками вопроса, да еще на LOR'е - без шансов.

Kroz ★★★★★
()

В рамках одного скрипта у тебя одни и те же переменные с одним и тем же значением объявлены несколько раз. Вынеси их сверху в единственном экземпляре. Напиши функцию или просто конструкцию, которая будет принимать две переменные: путь до исходных файлов и путь до места, куда производится бекап. Внутри этой функции или конструкции архивируешь и перемещаешь, куда нужно.

Niroday
()

Твой скрипт полное говно.

anonymous
()
Ответ на: комментарий от Niroday

В рамках одного скрипта у тебя одни и те же переменные с одним и тем же значением объявлены несколько раз. Вынеси их сверху в единственном экземпляре.

Можно подумать, это поможет. Взяли чужой код без всякого понимания, что-то подправили для своей портянки, скорее всего для нескольких каталогов и получили вот эту фигню, когда совершенно не к месту туда-сюда меняют IFS и STATUS и так далее.

vodz ★★★★★
()
Ответ на: комментарий от Niroday

Вот немного изменил скрипт:

#!/bin/bash
Name=site1
BP_name_file=$Name."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name\" запущено..." >>$LOGFILE
Source_dir="/var/www/html/drupal/"
TGT_dir="/home/user/backup/"
tar -czf $TGT_dir$BP_name_file $Source_dir &>>$LOGFILE
echo "Finish backup ${srv_name}"

Name1=site2
BP_name_file1=$Name1."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name1\" запущено..." >>$LOGFILE
Source_dir1="/var/lib/mysql/wp"
tar -czf $TGT_dir$BP_name_file1 $Source_dir1 &>>$LOGFILE
echo "Finish backup ${srv_name}"

Name2=site3
BP_name_file2=$Name2."$(date +'%Y%b%d%R')".tar.gz
LOGFILE=/home/user/backup/wplog.log
echo "=====================================================" >>$LOGFILE
echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
echo "Задание \"$Name2\" запущено..." >>$LOGFILE
Source_dir2="/var/lib/mysql/opencart"
tar -czf $TGT_dir$BP_name_file2 $Source_dir2 &>>$LOGFILE
echo "Finish backup ${srv_name}"

db_name=dbsite1
db_name_file=$db_name."$(date +'%Y%b%d%R')".tar.gz
db_source_dir="/var/lib/mysql/drupal/"
tar -czf $TGT_dir$db_name_file $db_source_dir &>>$LOGFILE

db_name1=dbsite2
db_name_file1=$db_name1."$(date +'%Y%b%d%R')".tar.gz
db_source_dir1="/var/lib/mysql/wp/"
tar -czf $TGT_dir$db_name_file1 $db_source_dir1 &>>$LOGFILE

db_name2=dbsite3
db_name_file2=$db_name2."$(date +'%Y%b%d%R')".tar.gz
db_source_dir2="/var/lib/mysql/opencart/"
tar -czf $TGT_dir$db_name_file2 $db_source_dir2 &>>$LOGFILE

date
syst_dir=/home/user/backup/
srv_name=user
srv_ip=127.0.0.1
srv_user=backup
srv_dir1="/home/user/backup/{$BP_name_file,$BP_name_file1,$BP_name_file2,$db_name_file,$db_name_file1,$db_name_file2}"
echo "Start backup ${srv_name}"
mkdir -p ${syst_dir}${srv_name}/
cd ${syst_dir}${srv_name}/
rm $(ls -t | tail -n +7) -rf
rsync -a --delete-after $srv_name@$srv_ip:$srv_dir1 ${syst_dir}${srv_name}/
date
echo "Finish backup ${srv_name}"

SysError
() автор топика
Ответ на: комментарий от SysError

Спасибо

Вам не это читать надо. У вас тривиальный скрипт, не требующий хитрых bash-конструкций. Вам надо читать о программировании вообще. Когда идентичные куски кода выносятся в функции, переменные накапливаются путём конкатенации, а не генерированием name1, name2 и так далее.

vodz ★★★★★
()
Ответ на: комментарий от SysError

Дык цикл замути

#!/bin/bash
sites="site1 site2 site3"
databases="db_site1 db_site2"

LOGFILE=/home/user/backup/wplog.log
Source_dir="/var/www/html/drupal/"
TGT_dir="/home/user/backup/"
db_source_dir="/var/lib/mysql/drupal/"

for site in $sites
do
  BP_name_file=$site."$(date +'%Y%b%d%R')".tar.gz
  echo "====================================================="
  echo "$(date +'%d-%b-%Y %R')"
  echo "Задание \"$Name\" запущено..."
  tar -czf $TGT_dir$BP_name_file $Source_dir
  echo "Finish backup ${srv_name}"
done >>$LOGFILE &>>$LOGFILE

for dbase in $databases
do
  db_name_file=$dbase."$(date +'%Y%b%d%R')".tar.gz
  tar -czf $TGT_dir$db_name_file $db_source_dir
done &>>$LOGFILE
anonymous
()

Самое важное в бекапах это их восстанавливаемость. Ты уверен что базы mysql после такого «горячего» копирования будут в порядке?

anonymous
()
Ответ на: комментарий от SysError

Посоветуйте тогда нужную литературу для изучения.

К сожалению, я уже не могу это читать, мне не интересно и потому ссылки не храню. Могу только дать конкретные советы по коду. Вот смотрите (write-only код, не тестировался):


LOGFILE=/home/user/backup/wplog.log
syst_dir=/home/user/backup/

backup() {
 local Name BP_name Source_dir
 Name=$1
 Source_dir=$2
 BP_name=$Name."$(date +'%Y_%b_%d%R')".tar.gz
 echo "=====================================================" >>$LOGFILE
 echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE
 echo "Задание \"$Name\" запущено..." >>$LOGFILE
 tar -czf $TGT_dir$BP_name $Source_dir >>$LOGFILE
 echo "Finish backup ${Source_dir}"
 srv_dir="${srv_dir:+$srv_dir }${syst_dir}/$BP_name"
}

backup site1 /var/www/html/drupal/

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от SysError

Лучше переработать эту строку?

Я вам дал, пусть и сложный, но действенный способ формирования этой строки в последней строке функции backup()

vodz ★★★★★
()
Ответ на: комментарий от vodz

Буду изучать и пробовать, спасибо и простите за мои слабые знания в этой области.

SysError
() автор топика
Ответ на: комментарий от SysError

https://dev.mysql.com/doc/refman/5.7/en/backup-methods.html

mysqldump, например.

Кстати у тебя myisam или innodb? Во втором случае то ты просто структуру копируешь. Данные в другом месте. Представляешь свою радость, когда это бы выяснилось в самый неподходящий момент!

anonymous
()
Ответ на: комментарий от Kroz

С таким русским, и с такими формулировками вопроса, да еще на LOR'е - без шансов.

Подписываюсь под каждым словом.

Вообще, не понятно, что ТС хочет, что для этого делал и почему не получается.

Ладно, предположим, русский — не его родной язык, тогда я готов закрыть на это глаза и ещё раз вчитаться, но результата это не даст, так как ТС хочет, чтобы ЛОР написал ему код, который делает что-то, что он не может описать.

r3lgar ★★★★★
()
Ответ на: комментарий от SysError

Все эти извращения с tar.gz не нужны.
Гит репозиторий сделай выше корня и по крону делай git add, git commit и копию в backup. У тебя будут все изменения за всё время работы этого скрипта, возможность отката и это будет весить как 2-3 архива, если изменений будет не много.

crutch_master ★★★★★
()

tar может писать архив прямо сразу на другой хост, без необходимости потом вызывать rsync: tar -czf somehost:/tmp/test.tar.gz dir/

Конечно, удалять старые копии придётся уже на том хосте, как-то так

ssh somehost "cd '${syst_dir}${srv_name}/' && ls -t | tail -n +4 | xargs rm"

legolegs ★★★★★
()
Ответ на: комментарий от r3lgar

Я не прошу что бы кто либо написал код, а прошу подсказать как можно сделать удобное добавление и удаление новых сайтов в скрипте. Если Вам сложно читать и приятней закидывать негативом мою личность, прошу просто игнорировать мои посты. Спасибо.

SysError
() автор топика
Ответ на: комментарий от SysError

Стоит InnoDB

https://dev.mysql.com/doc/refman/5.7/en/innodb-backup.html

copying files while the MySQL server is shut down

Надо выключать сервер, если копируешь файлы. И да - данные ты не бэкапишь.

И копируешь ты неправильно:

Perform a slow shutdown of the MySQL server and make sure that it stops without errors.

Copy all InnoDB data files (ibdata files and .ibd files) into a safe place.

Copy all the .frm files for InnoDB tables to a safe place.

Copy all InnoDB log files (ib_logfile files) to a safe place.

Copy your my.cnf configuration file or files to a safe place.

anonymous
()
Ответ на: комментарий от crutch_master

Спасибо за предоставленные данные, ознакомлюсь и попытаюсь разобраться

SysError
() автор топика
Ответ на: комментарий от SysError

Если Вам сложно читать и приятней закидывать негативом мою личность, прошу просто игнорировать мои посты. Спасибо.

Проигнорируй закидывание тебя говном лучше. Первый раз в интернете как будто. Тем более, что это ЛОР. Тут во всех кидают говном.

как можно сделать удобное добавление и удаление новых сайтов в скрипте.

Сделай с git, как я тебе сказал. Там эта задача будет решаться правкой .gitignore

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от anonymous

Выключение сервера нужно прописывать в скрипте или просто перед бэкапом оффать ее в ручном режиме?

SysError
() автор топика

Ну и формулировка, предлагаю вот что, раз задача просто изменить

echo "#Just yet another comment" >> ./your_script.sh
Shulman
()
Ответ на: комментарий от SysError

Тебе vodz уже написал, как надо выносить повторяющиеся части в функцию. Осталось записать таблицу сайтов в файл в простом формате

site1 path1/aaa/
size2 path2/bbb/
и читать его в цикле:
while read site path; do
  backup $site $path
done < config.cfg

Пути и название сайтов не должны содержать пробелов, иначе придётся вводить специальный символ-разделитель (по традиции табуляцию, двоеточие или точку с запятой) и читать конфиг с учётом него.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от SysError

Вообще не копируй файлы. Тогда и выключать не надо.

Используй mysqldump. Это и гибче гораздо.

anonymous
()
Ответ на: комментарий от SysError

Бэкапы должны быть полностью автоматическими, иначе это говно, а не бекапы. Обычно cron.daily выполняется в 4 утра, так что в большинстве организаций остановка сервера не создаёт проблем пользователям.

legolegs ★★★★★
()
Ответ на: комментарий от crutch_master

Зачем тащить в бекапилку целый git, когда есть божественный rdiff-backup? И что вы с гитом будете делать, когда место кончится и 100500 старых копий захочется удалить?

legolegs ★★★★★
()
Ответ на: комментарий от SysError

C бекапилкой от crutch_master всё иначе. Я же на его пост отвечал.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

И что вы с гитом будете делать, когда место кончится и 100500 старых копий захочется удалить?

Что надо такое делать с гитом, чтобы место кончилось? У меня за 4 года весь бекап весил как 3 архива максимум и то, потому что в бд ключи плыли. Да и можно как-нибудь старую историю подрезать, скорее всего. Вот, первое, что нагуглил, например: https://stackoverflow.com/questions/11687899/remove-cut-off-gits-revision-com...

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от anonymous

Вообще надо и базу бекапить, и структуру. Для лентяев есть automysqlbackup.

mandala ★★★★★
()
Ответ на: комментарий от vodz

А как можно прописать:

backup site1 /var/www/html/drupal/
backup site2 /var/www/html/wp/
backup site3 /var/www/html/opencart/
and
backup db_site1 /var/lib/mysql/drupal/
backup db_site2 /var/lib/mysql/wordpress/
backup db_site3 /var/lib/mysql/opencart/
укомплектовать в 2 переменных?

SysError
() автор топика
Ответ на: комментарий от SysError

укомплектовать в 2 переменных?

Я не совсем понял вопрос, что вам хочется. Получить двухмерный массив чтоли? В bash их нет, но это обычно просто эмулируется строками с разделителями, что-то типа sites=(«site1:/var/www/html/drupal/», «site2:/var/www/html/wp/» ...) а потом вызовом ${sites//:/ }

vodz ★★★★★
()
Ответ на: комментарий от vodz

Используя ваш метод выдает ошибку

23-Фев-2018 09:32
Задание "«site1" запущено...
tar: Удаляется начальный `/' из имен объектов
tar: /var/www/html/drupal/»,: Функция stat завершилась с ошибкой: Нет такого файла или каталога
tar: Завершение работы с состоянием неисправности из-за возникших ошибок
Finish backup /var/www/html/drupal/»,

SysError
() автор топика
Ответ на: комментарий от SysError

Вы разницу между кавычками не знаете? Двойные кавычки (знак дюйма) отличен от русских кавычек-ёлочек, что тут в форуме на них автоматически заменяются. Кстати, там ещё и квадратные скобки парсер съел, было:

${sites[0]//:/ }

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Я понимаю, но я пробовал и так и так. Суть остается той же:

23-Фев-2018 10:04
Задание "site1" запущено...
tar: Удаляется начальный `/' из имен объектов
tar: /var/www/html/drupal/,: Функция stat завершилась с ошибкой: Нет такого файла или каталога
tar: Завершение работы с состоянием неисправности из-за возникших ошибок
Finish backup /var/www/html/drupal/,

SysError
() автор топика
Ответ на: комментарий от SysError

Суть остается той же

Фига себе заявочки. Суть теперь правильная: вам подаются правильные аргументы, имя задачи и каталог. То что оно у вас не существует к вопросу не относится.

PS: ааа, там запятые лишние, уберите. :)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.