LinuxForum.Fans
Тема

Подскажите как подправить скрипт

Автор: XliN 34 сообщений 8861 просмотров
#104436

Я вот за пол часика накатал скрипт на bash и возникло пару вопросов. Я не спец и скорее всего он кривой.
1. Как в IF добавить второе значение.
Что бы он проверял условие: "Если первая и вторая папка существует то "

2. Как правильно вести лог всего что делается в скрипте. Подписывать как я к нужной строке вывод в нужный мне файл?

3. Как заставить tar писать свой вывод мне в файл? У него есть ключик -v. Вот это мне и надо записать. Это не проблема, но как к каждой его строчке вывода приписать дату?

text
#!/bin/bash

SOURCE_BACKUP_DIR="/home/xlin/samba/" BACKUP_DIR="/home/xlin/backup/12345/" COPY_DIR="/home/xlin/data/" LOG_FILE="/var/log/backup_parus.log"

function backup_parus() { echo "Compressing database..." tar -czf ${BACKUP_DIR}parus-`date "+%Y-%m-%d"`.tar.gz $SOURCE_BACKUP_DIR echo "Copy database Parus fo RAID disk..."; cp ${BACKUP_DIR}parus* $COPY_DIR echo "`date` Backup Parus database in $COPY_DIR successfully" >> $LOG_FILE }

if [ -d "$BACKUP_DIR" ]; then backup_parus else echo "`date` Каталога ${BACKUP_DIR} не существует. Будет создан автоматически" >> $LOG_FILE mkdir -p $BACKUP_DIR backup_parus exit 1 fi

Прошу не пинать. Скрипты пишу редко )) Вот хочу разобраться.

#104439
xlin написал:
1. Как в IF добавить второе значение.
Что бы он проверял условие: "Если первая и вторая папка существует то "

2. Как правильно вести лог всего что делается в скрипте. Подписывать как я к нужной строке вывод в нужный мне файл?

3. Как заставить tar писать свой вывод мне в файл? У него есть ключик -v. Вот это мне и надо записать. Это не проблема, но как к каждой его строчке вывода приписать дату?

1a) воспользоваться ключом -a
[console][ -d dir1 -a -d dir2 ][/console]
1b) воспользоваться связкой

text
[ -d dir1 ] && [ -d dir2 ]

1c) попросту повторить условие

text
if [ -d dir1 ]; then
 if [ -d dir2 ]; then
  # что-то делаем
 fi
fi

2) ага. можно ещё перенаправить вывод всего скрипта.
3) можно воспользоваться ключом -vv, и обрезать лишнее sed.


ЗЫЖ отличный скрипт ;)

#104599

Спасибо. Закончил со скриптом. Буду его потом еще развивать. Наверное :D

Показать
text
# Backup Parus database v 0.1
#!/bin/bash

SOURCE_BACKUP_DIR="/home/xlin/samba/" # Указываем путь что будем бекапить BACKUP_DIR="/home/xlin/backup/" # Папка куда складывается бекап на сервере COPY_DIR="/home/xlin/data/" # Куда потом копировать с сервера готовый бекап (зеркалирование) LOG_FILE="/var/log/backup_parus.log" # Путь к файлу лога

function backup_parus() { echo "Подождите. Выполняется процесс архивирования баз Паруса."; tar -czf ${BACKUP_DIR}parus-`date "+%Y-%m-%d"`.tar.gz $SOURCE_BACKUP_DIR echo "Копируется готовый архив на сервер с RAID массивом (зеркалирование)."; cp ${BACKUP_DIR}parus* $COPY_DIR echo "`date` Backup Parus database in $COPY_DIR successfully" >> $LOG_FILE }

if [ -d "$SOURCE_BACKUP_DIR" ]; then if [ -d "$COPY_DIR" ]; then echo "Путь к папке с базами PARUS найден..."; echo "Указанный путь резервного копирования базы Parus найден"; else echo "`date` WARNING: Проверте путь к директории, куда копируется файл бекапа PARUS" >> $LOG_FILE echo "`date` WARNING: Каталога ${COPY_DIR} не существует. Будет создан автоматически" >> $LOG_FILE mkdir -p $COPY_DIR fi else echo "`date` ERROR: Проверте путь к директории, где хранятся базы PARUS" >> $LOG_FILE echo "ERROR: Произошла ошибка. Подробная информауия в /var/log/backup.log"; exit 1 fi

if [ -d "$BACKUP_DIR" ]; then backup_parus else echo "`date` Каталога ${BACKUP_DIR} не существует. Будет создан автоматически" >> $LOG_FILE mkdir -p $BACKUP_DIR backup_parus exit 1 fi

#131543

Почему не работает?

text

function test()
{
    if [ ! $(date +%w) = 6 -o  $(date +%w) = 0 ]; then
        echo "Сегодня не суббота и не воскресенье"
    else
        echo "Сегодня суббота или воскресенье"
    fi
}

А вот так работает )))

text
function test()
{
    if [ ! $(date +%w) = 6 ] && [ ! $(date +%w) = 0 ]; then
        echo "Сегодня не суббота и не воскресенье"
    else
        echo "Сегодня суббота или воскресенье"
    fi
}
#131568

А так?

text

...
if [ ! $(date +%w) = 6 -a  $(date +%w) = 0 ]; then
...
#131590

man test

-o ИЛИ

#131597

Оставил второй вариант. Работает и ладно. Скрипт сократил, а то что то много коментов было. Может чего криво там? Взгляните профессиональным глазом.

text
#!/bin/bash

SOURCE_BACKUP_DIR="/var/log/" # Указываем путь что будем бекапить BACKUP_DIR_PARUS="/root/script/backup/" # Папка куда складывается бекап на сервере SOURCE_DIR_SHABLON="/var/log/" # Папка к шаблонам Паруса BACKUP_DIR_SHABLON="/root/script/backup/shablon/" # Где будут лежать бекапы шаблонов COPY_DIR="/root/script/backup_mirror/" # Куда потом копировать с сервера готовый бекап (зеркалирование) LOG_FILE="/var/log/backup_test.log" # Путь к файлу лога

function backup_parus() { if [ ! $(date +%w) = 6 ] && [ ! $(date +%w) = 0 ]; then tar -czf ${BACKUP_DIR_PARUS}parus-`date "+%Y-%m-%d"`.tar.gz $SOURCE_BACKUP_DIR cp ${BACKUP_DIR_PARUS}parus* $COPY_DIR echo "`date` Backup Parus database in $COPY_DIR successfully" >> $LOG_FILE else echo "`date` Backup базы Паруса не выполнен, т.к. сегодня $(date +%A)" >> $LOG_FILE fi }

function backup_shablon(){ if [ $(date +%d) = 01 ]; then tar -czf ${BACKUP_DIR_SHABLON}shablon-`date "+%Y-%m-%d"`.tar.gz $SOURCE_DIR_SHABLON cp ${BACKUP_DIR_SHABLON}shablon* $COPY_DIR echo "`date` Backup шаблонов выполнен, т.к. сенодня 1 чило нового месяца" >> $LOG_FILE fi }

if [ -d "$SOURCE_BACKUP_DIR" ] && [ -d "$COPY_DIR" ] && [ -d "$BACKUP_DIR_PARUS" ] && [ -d "$BACKUP_DIR_SHABLON" ]; then echo "`date` Пути к папкам найдены..." >> $LOG_FILE; backup_parus backup_shablon exit 1 else echo "`date` Указанные пути к папкам не существуют, будут созданы автоматически" >> $LOG_FILE mkdir -p $COPY_DIR mkdir -p $BACKUP_DIR_PARUS mkdir -p $BACKUP_DIR_SHABLON backup_parus backup_shablon exit 1 fi

Мне не нравится последний кусок, где идет проверка на наличие папок и обращение к процедурам.

#131830
XliN написал:
tar -czf ${BACKUP_DIR_PARUS}parus-`date "+%Y-%m-%d"`.tar.gz $SOURCE_BACKUP_DIR
cp ${BACKUP_DIR_PARUS}parus* $COPY_DIR

вот в этом месте может закончится свободное место. Необходимо отправить админу мыло, а лучше смску. А то получится так, что бекап не сделается. :( Проверьте содержимое $?, там должен быть ноль.

XliN написал:
Мне не нравится последний кусок, где идет проверка на наличие папок и обращение к процедурам.

мне тоже. вот тут как раз надо использовать ИЛИ
вариант 1: использовать ключ -o
вариант 2: использовать связку ||.
ну и конечно сам бекап можно вынуть из if-fi.

#134108

drBatty, Завтра попробую чуть переписать скрипт, что бы он как то по элегантней выглядел. Подправлю одну ошибку, которую я обнаружил вчера и если не чего получится отпишусь на форуме.

З.Ы. Кстати отличная идея проверять место на диске и сообщать об этом админу (то есть мне). Надо будет в будущем реализовать. :D

#134342
drBatty написал:
Проверьте содержимое $?, там должен быть ноль.

Проверил. Там нолик, а для чего это? Если ноль, то место на диске есть? Как это должно выглядеть?

Еще попутно вопросик. Как реализовать удаление определенного кол-ва файлов? Например удалять раз в месяц старые файлы бекапа. Ну штук 10 например.

Вот исправленный скрипт. Вроде работает. Протестил пару раз.
Что он делает скрипт:

  • Бекапит базу по будням
  • Бекапит шаблоны базы раз в месяц

Хочется еще замутить проверку места на дисках, где складываются архивы и слать мыло.

text
#!/bin/bash

SOURCE_BACKUP_DIR="/var/log/" # Указываем путь что будем бекапить BACKUP_DIR_PARUS="/root/script/backup/" # Папка куда складывается бекап на сервере SOURCE_DIR_SHABLON="/var/log/" # Папка к шаблонам Паруса BACKUP_DIR_SHABLON="/root/script/backup/shablon/" # Где будут лежать бекапы шаблонов COPY_DIR="/root/script/backup_mirror/" # Куда потом копировать с сервера готовый бекап (зеркалирование) LOG_FILE="/var/log/backup_test.log" # Путь к файлу лога BACKUP_SHAB_DATE="25"

function backup_parus() { tar -czf ${BACKUP_DIR_PARUS}parus-`date "+%Y-%m-%d"`.tar.gz $SOURCE_BACKUP_DIR cp ${BACKUP_DIR_PARUS}parus-`date "+%Y-%m-%d"`* $COPY_DIR echo $? echo "`date` Backup Parus database in $COPY_DIR successfully" >> $LOG_FILE }

function backup_shablon() { tar -czf ${BACKUP_DIR_SHABLON}shablon-`date "+%Y-%m-%d"`.tar.gz $SOURCE_DIR_SHABLON cp ${BACKUP_DIR_SHABLON}shablon-`date "+%Y-%m-%d"`* $COPY_DIR echo "`date` Backup шаблонов выполнен, т.к. сенодня $BACKUP_SHAB_DATE чило" >> $LOG_FILE }

if [[ ! -d $BACKUP_DIR_SHABLON || ! -d $COPY_DIR ]]; then echo "`date` Папки не найдены!" >> $LOG_FILE mkdir -p $BACKUP_DIR_SHABLON mkdir -p $COPY_DIR fi

if [[ ! $(date +%w) = 6 && ! $(date +%w) = 0 ]]; then backup_parus if [ $(date +%d) = $BACKUP_SHAB_DATE ]; then backup_shablon fi else echo "`date` Backup базы Паруса не выполнен, т.к. сегодня $(date +%A)" >> $LOG_FILE fi

#134353
XliN написал:
Проверил. Там нолик, а для чего это? Если ноль, то место на диске есть? Как это должно выглядеть?

проверять надо после КАЖДОЙ команды, которая МОЖЕТ завершится с ошибкой.
если 0 - значит прошлая команда завершилась успешно. не ноль - ошибка. и надо что-то делать.

XliN написал:
Как это должно выглядеть?

text
err=$?
if [ $err != 0 ]; then
  send_sms --to=admin --text="всё, ппц!!! при бекапе случилась СТРАШНАЯ НЕХ с кодом $err. Скрипт рухнул, бекапа нет! СРОЧНО приезжай!!!"
  exit $err
fi

как-то так.

XliN написал:
Кстати отличная идея проверять место на диске и сообщать об этом админу (то есть мне). Надо будет в будущем реализовать.

идея довольно странная. Вы уверенны, что вы первый до такого додумались? Нет. Именно для этого и существует код ошибки.
есть и ещё вариант: читайте man bash на предмет опции -x. ну и man crontab на предмет отправки мыла. Идея такая: скрипт падает, а crond шлёт мыло.

#138016

Посмотрел на данный скрипт по идее подходит. Но мне надо чуток другое. Может кто поможет.
Есть папка например /video/ можно конечно забекапить всё но мне желательно заповать все файлы кроме последнего по дате

133018 2011-03-06 14:27 97-20110306142520.avi
1978918 2011-03-06 14:30 98-20110306142851.avi
2619746 2011-03-06 14:33 99-20110306143141.avi

Вот например упаковать всё кроме 2619746 2011-03-06 14:33 99-20110306143141.avi можно такое реализовать?

#138025

Хотя как вариант пакую всю папку, но как удалить все кроме последней записи.

#138029
Kettler написал:
Есть папка например /video/ можно конечно забекапить всё но мне желательно заповать все файлы кроме последнего по дате

про ls -t наслышаны? ок. это сортировка по времени. вам не хватает удаления последней строки: sed '$d'

#138030

drBatty я в программировании не особ поэтому и прошу помощи если не трудно напишите полностью команду.
как удалить всё кроме последней записи.

#138040

построение списка файлов
[console]$ /bin/ls -t | sed '1d;$d' | tee file_list[/console]
(обрезается первая строка, где "итого", и последняя, вам не нужная)
упаковка файлов из списка
[console]$ tar -cvvf arc.tar --files-from file_list[/console]

#138043

ЗЫЖ на самом деле можно и на лету паковать, только это очень долго, и куча проблем возникает в посте №16 самый лучший ИМХО способ.
кроме того, список можно обработать. например отсортировать по расширению, что-бы лучше сжалось. Именно так делает WinRAR.

#138051

Спасибо! А как можно ещё удалить file_list ?

#138057
Kettler написал:
А как можно ещё удалить file_list ?

[console]$ rm file_list[/console]
внутри скрипта подтверждения не будет.

#138058

Поидее конечно кастыль могу тормознуть демон запаковать после удалить и снова запустить.

Войдите или зарегистрируйтесь, чтобы ответить.