Как оптимизировать данный скрипт?

Господа гляньте незамыленым взглядом, задача
1. сократить до минимума, оставив максимально читабельным.
2. Избавитсья от tmpdir
3. Может у кого есть идеи как все-таки запихнуть БД в архив сохранив 1 задачу, (tar.bz без вариантов)
4. Может еще как-то сократить чтение Конфигов mysql

кусок dbconn
$DBHost = "localhost";
$DBHost = "localhost:3307
$DBPassword = "123456";
$DBLogin = "root";
$DBDebug = true;

#!/bin/sh
# Пример пути до сайта /var/www/site.ru/web/
SITEDIR="/var/www"                                  # Папка до названия доменаов
WEB="web"                                           # Папка после названия доменов (если есть)
LIST=${1:-`ls -L $SITEDIR | grep -E ".*\.\w{1,5}"`} # Название сайта, тут выбор или аргумент или, регулярка  можно убрать только -L ;) 
DBCONN="bitrix/php_interface/dbconn.php"            # Откуда читать настройки mysql
FTPUSER="*******"                                   # Логин FTP сервера
FTPPASS="****************"                          # Пароль FTP
FTPHOST="**************************"                # сервер FTP
FTPDIR="/server8/site/"                             # папка на FTP
TMPDIR="/var/backup/site"                           # Где будут храниться временные файлы
DATE=`date +"%Y-%m-%d"`      

test ! -d $TMPDIR/`date +%Y`/`date +%m` && mkdir -p $TMPDIR/`date +%Y`/`date +%m` # создаем  структ уру каталогов если их нет

for ELEMENT in $LIST
    do
		if [ ! -f /$SITEDIR/$ELEMENT/$WEB/$DBCONN ]; 
			then
			    echo " Файл $SITEDIR/$ELEMENT/$WEB/$DBCONN не найден, сайт будет без БД!"
			else        
				DBLOGIN=$(grep "^\$DBLogin =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
				DBPASS=$(grep "^\$DBPassword =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
				DBNAME=$(grep "^\$DBName =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
				mysqldump -u$DBLOGIN -p$DBPASS $DBNAME > $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME
		fi 

    echo "Архивируем сайт $ELEMENT" 
	tar -cvpzf $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz --directory $SITEDIR/$ELEMENT/$WEB --ignore-failed-read --exclude='./bitrix/tmp' --exclude='./bitrix/updates' --exclude='./bitrix/backup/*\.gz*' --exclude='./bitrix/backup/*\.tar*' --exclude='./bitrix/cache' --exclude='./bitrix/managed_cache' --exclude='./bitrix/stack_cache' --exclude='./upload/resize_cache' --exclude='./stats' . >> /dev/nool 2> /var/log/backup_error.log
	rm -f $SITEDIR/$ELEMENT/$WEB/$DBNAME\-$DATE.sql # поскльку ложим на реальный сайт, ибо нормально добавить в архив не получитяс.
	
	echo "Сохраняем $ELEMENT на FTP"
	wput  --basename=$TMPDIR --limit-rate=60000K --timestamping  --remove-source-files --tries=2 $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR
	rm -f $TMPDIR/`date +%Y`/`date +%m`/$ELEMENT-$DATE.tar.gz
  done
rm -r $TMPDIR
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
А зачем?
Тут все достаточно оптимально.
Ну разве что заменить `` на $()
И year и month не вычислять каждый раз, а сделать это один раз.

#!/bin/sh
# Пример пути до сайта /var/www/site.ru/web/
SITEDIR="/var/www"                                  # Папка до названия доменаов
WEB="web"                                           # Папка после названия доменов (если есть)
LIST=${1:-$(ls -L $SITEDIR | grep -E ".*\.\w{1,5}")} # Название сайта, тут выбор или аргумент или, регулярка  можно убрать только -L ;) 
DBCONN="bitrix/php_interface/dbconn.php"            # Откуда читать настройки mysql
FTPUSER="*******"                                   # Логин FTP сервера
FTPPASS="****************"                          # Пароль FTP
FTPHOST="**************************"                # сервер FTP
FTPDIR="/server8/site/"                             # папка на FTP
TMPDIR="/var/backup/site"                           # Где будут храниться временные файлы
DATE=$(date +"%Y-%m-%d")
YEAR=$(date +%Y)
MONTH=$(date +%m)

test ! -d $TMPDIR/$YEAR/$MONTH && mkdir -p $TMPDIR/$YEAR/$MONTH # создаем  структ уру каталогов если их нет

for ELEMENT in $LIST
    do
    if [ ! -f /$SITEDIR/$ELEMENT/$WEB/$DBCONN ]; 
      then
          echo " Файл $SITEDIR/$ELEMENT/$WEB/$DBCONN не найден, сайт будет без БД!"
      else        
        DBLOGIN=$(grep "^\$DBLogin =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
        DBPASS=$(grep "^\$DBPassword =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
        DBNAME=$(grep "^\$DBName =" $SITEDIR/$ELEMENT/$WEB/$DBCONN | cut -f2 -d'"')
        mysqldump -u$DBLOGIN -p$DBPASS $DBNAME > $SITEDIR/$ELEMENT/$WEB/$DBNAME-$DATE.sql && echo "Дамп БД $DBNAME будет сохранен в корне сайта"  ||  echo "Ошибка дампа базы данных " $DBNAME
    fi 

    echo "Архивируем сайт $ELEMENT" 
  tar -cvpzf $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz --directory $SITEDIR/$ELEMENT/$WEB --ignore-failed-read --exclude='./bitrix/tmp' --exclude='./bitrix/updates' --exclude='./bitrix/backup/*\.gz*' --exclude='./bitrix/backup/*\.tar*' --exclude='./bitrix/cache' --exclude='./bitrix/managed_cache' --exclude='./bitrix/stack_cache' --exclude='./upload/resize_cache' --exclude='./stats' . >> /dev/nool 2> /var/log/backup_error.log
  rm -f $SITEDIR/$ELEMENT/$WEB/$DBNAME-$DATE.sql # поскльку ложим на реальный сайт, ибо нормально добавить в архив не получитяс.
  
  echo "Сохраняем $ELEMENT на FTP"
  wput  --basename=$TMPDIR --limit-rate=60000K --timestamping  --remove-source-files --tries=2 $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz ftp://$FTPUSER:$FTPPASS@$FTPHOST$FTPDIR
  rm -f $TMPDIR/$YEAR/$MONTH/$ELEMENT-$DATE.tar.gz
  done
rm -r $TMPDIR


Если хотите оптимизировать, надо менять правила игры. Например выяснить, что на удаленный хост можно не ftp, а ssh тогда можно разные вещи делать, начиная от tar прямо на удаленный хост, или вообще подключить удаленный хост по NFS и сразу на него ложить как в папку.
Не очень понятно, что вы имеете ввиду про "сохранить 1 задачу"
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shambler81
@shambler81 Автор вопроса
не нравится реализация, я и так уже удалил милион говна,
как минимум конфиг например читать прям переменные сразу, поскольку синтаксис переменных с башем совпадает, через read наверное, но я не делал, его ни разу, видишь 3 раза подряд лезу в один и то же файл, да еще и обрезаю потом , и присваиваю, в идиале просто считать их с файла, опять же архивировать бд приходится через жопу поскольку ее ложить приходится а потом удалят, да и tmpdir не нужен, по идее сразу в потоке делать, ;( нехрина ssd лишний раз мурыжить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы