URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10288
[ Назад ]

Исходное сообщение
"проверка выполнение сработала ли какая-либо команда в bash "

Отправлено sa1nt , 19-Ноя-19 17:44 
День добрый, есть скрипт который бекапит базы mysql. столкнулся с такой проблемой, поломалась как-то база и скрипт бекап делал zero размер с ошибкой но, делал. Возник вопрос как проверять что команды выполнились без ошибки? А если есть ошибка отправить сообщение на email.
Вот сам скрипт:

mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par1 | gzip -c > /var/backups/backup/mysql/par1-date "+%Y-%m-%d".sql.gz

mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par2 | gzip -c > /var/backups/backup/mysql/par2-date "+%Y-%m-%d".sql.gz

mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par3 | gzip -c > /var/backups/backup/mysql/par3-date "+%Y-%m-%d".sql.gz

mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par4 | gzip -c > /var/backups/backup/mysql/par4-date "+%Y-%m-%d".sql.gz

#Удаляем файлы бекапов старше 7 дней tmpwatch -m 7d /var/backups/backup/mysql/


Содержание

Сообщения в этом обсуждении
"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено Vlad , 19-Ноя-19 18:58 
http://kedar.nitty-witty.com/blog/mysql-database-backup-shel...

"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено Licha Morada , 19-Ноя-19 19:29 
> День добрый, есть скрипт который бекапит базы mysql. столкнулся с такой проблемой,
> поломалась как-то база и скрипт бекап делал zero размер с ошибкой
> но, делал. Возник вопрос как проверять что команды выполнились без ошибки?
> А если есть ошибка отправить сообщение на email.

Придумыайте критерии по которым будете определять, удовлетворительно прошёл бекап или нет. Например:

- Ловите exit code выполнения mysqldump. Имейте в виду "что в лоб" вы получите exit code выполнения gzip а не mysqldump. Типа
set -o pipefail
mysqldump какие-то-параметры-чтобы-была-ошибка | gzip -c > par.sql.gz
echo $?

- Если при типичной ошибке получается размер файла 0, то это может оказаться уже полезно. Типа
if [ $(wc -c < par.sql.gz) -le 0 ] ...

- Смотрите на содежимое получившегося файла, например, на количество незакоментированных строк и/или наличие какого-нибудь кодового слова. Типа
if zcat par.sql.gz | wc -l ...
if zcat par.sql.gz | grep волшебное-слово

Ну и, как водится, пара непрошенных советов:

Не передавайте пароль mysqldump в командной строке, храните его в ~/.my.cnf или типа того.
Не лезте в базу из скрипта как root, создайте специального пользователя чтобы смог прочесть всё для бакапа из правильных баз, но не смог порочесть из неправильных или что-то испортить.

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


"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено sa1nt , 20-Ноя-19 11:48 
>[оверквотинг удален]
> Ну и, как водится, пара непрошенных советов:
> Не передавайте пароль mysqldump в командной строке, храните его в ~/.my.cnf или
> типа того.
> Не лезте в базу из скрипта как root, создайте специального пользователя чтобы
> смог прочесть всё для бакапа из правильных баз, но не смог
> порочесть из неправильных или что-то испортить.
> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
> не только в случае ошибки, но и при успешном выполнении, пусть
> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
> и на каком именно месте ошиблся, и что именно пытался сделать.

не могли бы написать для меня ибо я не очень в этом деле. в долгу не останусь!


"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено erera22 , 20-Ноя-19 14:46 
mysqldump --any-dump-keys db > db.dump 2>/tmp/err
[ $? -eq 0 ] || cat "/tmp/err"

"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено sa1nt , 20-Ноя-19 16:05 
>[оверквотинг удален]
>> типа того.
>> Не лезте в базу из скрипта как root, создайте специального пользователя чтобы
>> смог прочесть всё для бакапа из правильных баз, но не смог
>> порочесть из неправильных или что-то испортить.
>> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
>> не только в случае ошибки, но и при успешном выполнении, пусть
>> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
>> и на каком именно месте ошиблся, и что именно пытался сделать.
> не могли бы написать для меня ибо я не очень в этом
> деле. в долгу не останусь!

Прошу прощения Был в отчаянии.


"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено Licha Morada , 20-Ноя-19 20:13 
>>[оверквотинг удален]
>> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
>> не только в случае ошибки, но и при успешном выполнении, пусть
>> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
>> и на каком именно месте ошиблся, и что именно пытался сделать.
> не могли бы написать для меня ибо я не очень в этом
> деле. в долгу не останусь!

Боюсь, что нет. Не мой бизнес.


"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено sa1nt , 20-Ноя-19 15:33 
Сделал - вроде работает.
email с авторизацией.
Вот код может пригодится кому.


#/bin/bash

allerror=""

set -o pipefail

mysqldump -user -hlocalhost -password --default-character-set=cp1251 par1 | gzip -c > /var/backups/backup/mysql/par1-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
  allerror="Backup базы par1 не выполнен\n"
fi

mysqldump -user -hlocalhost -password --default-character-set=cp1251 par2 | gzip -c > /var/backups/backup/mysql/par2-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
  allerror="${allerror}Backup базы par2 не выполнен\n"
fi

mysqldump -user -hlocalhost -password --default-character-set=cp1251 par3 | gzip -c > /var/backups/backup/mysql/par3-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
  allerror="${allerror}Backup базы par3 не выполнен\n"
fi

mysqldump -user -hlocalhost -password --default-character-set=cp1251 par4 | gzip -c > /var/backups/backup/mysql/par4-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
  allerror="${allerror}Backup базы par4 не выполнен\n"
fi

if  [[ -n "$allerror" ]]; then

  TMP=$(mktemp)
  FROM_EMAIL_ADDRESS="откого@example.net"
  TO_EMAIL_ADDRESS="кому@example.net"
  EMAIL_SUBJECT="Тема письма"
  SMTP="smtp.example.net:25"
  FRIENDLY_NAME="User Name"
  EMAIL_ACCOUNT_PASSWORD="smtp_password"

cat > $TMP << EOF
EOF

cat $TMP | \
        echo -e $allerror  | iconv -t UTF-8 | mailx -v \
        -s "$EMAIL_SUBJECT" \
        -S smtp-auth=login \
        -S smtp=${SMTP} \
        -S from="${FROM_EMAIL_ADDRESS}(${FRIENDLY_NAME})" \
        -S smtp-auth-user=$FRIENDLY_NAME \
        -S smtp-auth-password=$EMAIL_ACCOUNT_PASSWORD \
        $TO_EMAIL_ADDRESS

[ -e $TMP ] && rm $TMP
fi



"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено Licha Morada , 20-Ноя-19 20:26 
> Сделал - вроде работает.

Замечательно.

Там ещё много стружки можно снять.
Имейте в виду, что если вы запускаете скрипт из Cron, то этот сервис сам умеет слать почту. Таким образом, в скрипте можно не возиться с настройкой и запуском mailx, а просто писать диагностику на стандартный вывод (stdout). Cron это подхватит, завернёт и скормит системному почтовику. Заодно пометит, если возвращённый код отличается от нуля.


"проверка выполнение сработала ли какая-либо команда в bash "
Отправлено sa1nt , 21-Ноя-19 11:40 
>> Сделал - вроде работает.
> Замечательно.
> Там ещё много стружки можно снять.
> Имейте в виду, что если вы запускаете скрипт из Cron, то этот
> сервис сам умеет слать почту. Таким образом, в скрипте можно не
> возиться с настройкой и запуском mailx, а просто писать диагностику на
> стандартный вывод (stdout). Cron это подхватит, завернёт и скормит системному почтовику.
> Заодно пометит, если возвращённый код отличается от нуля.

Спасибо за наводку.