2014-10-14 3 views
3

Я сейчас пытаюсь написать сценарий, который поддерживает несколько моих сайтов вместе с их базами данных.Поймать ошибку mysqldump в скрипте bash

Все работает хорошо, но я стараюсь быть немного умнее с моим журналом - в принципе, на данный момент он попытается запустить mysqldump и будет эхом успеха или неудачи.

Что я предпочел бы сделать, это выводить фактическую ошибку, а не просто бесполезное сообщение «mysqldump failed». Я имел взгляд вокруг, и я почти в состоянии сделать это, как я хочу, используя «2> log_file.txt»

Моя оригинальная команда:

mysqldump -u asdsa --password=$DB_PASS $DB_NAME > $MYSQL_LOCATION 

if [ "$?" -eq 0 ] 
then 
    echo -e "mysqldump successfully finished at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
else 
    echo -e "mysqldump failed at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
fi 

Поэтому я добавил «2> $ LOG_LOCATION |» чтобы поймать фактическую ошибку. Так что мой обновленный команда выглядит следующим образом (это добавление в первой строке):

mysqldump -u $DB_USER--password=$DB_PASS $DB_NAME 2> $LOG_LOCATION | > $MYSQL_LOCATION 

if [ "$?" -eq 0 ] 
then 
    echo -e "mysqldump successfully finished at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
else 
    echo -e "mysqldump failed at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
fi 

Это выводит сообщение об ошибке в мой лог-файл, но переписывает ничего там. Это также означает, что моя ошибка, проверяющая, не выдает ли оператор ошибку.

Есть ли способ, что я могу:

а) поймать фактическую ошибку в функции туздЫшпра (т.е. доступ запрещена для этого пользователя) б) добавить эту ошибку в существующем журнале ошибок с) также добавить сообщение об успешном завершении или сбое после выданной выше ошибки

Любая помощь будет замечательной!

Спасибо!

+1

Вы также можете добавить с переадресацией: '2 >> $ LOG_LOCATION', поэтому используйте это в своей команде mysqldump, чтобы не перезаписывать файл журнала. – zerodiff

ответ

7

Поэтому я добавил «2> $ LOG_LOCATION | "

Это ошибка - символ трубы лишний и изменяет значение простого перенаправления в конвейер.

В любом случае, правильный способ использования if - запустить фактическую команду, успех которой вы хотите проверить как условие.

if mysqldump -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" 2>"$LOG_LOCATION" >"$MYSQL_LOCATION" 
then 
    echo -e "mysqldump successfully finished at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
else 
    echo -e "mysqldump failed at $(date +'%d-%m-%Y %H:%M:%S')"$'\r' >> "$LOG_LOCATION" 
fi 

Вы, вероятно, лучше с printf над echo -e, но я не буду менять эти части.

+0

Мне очень нравится этот ответ! 'if mysqldump ...' является таким очевидным ответом, но он никогда не заставлял меня использовать его! Добавлен к предложению @ zerodiff об использовании '2 >> $ LOG_LOCATION', это идеальное решение. Дополнительные предложения также более чем приветствуются.Благодаря! – 0Neji

4

а) Вы можете поймать выходной сигнал ошибки в переменной так:

somevar="$((mysqldump -u $DB_USER --password=$DB_PASS $DB_NAME > $MYSQL_LOCATION) 2>&1)" 

б) вы можете проверить содержимое этой переменной, отображать сообщение, как обычно, а

) Вы может легко направить его в файл журнала с помощью echo "$somevar" >> $LOG_LOCATION

С уважением

Смежные вопросы