在bash脚本中捕获mysqldump错误

时间:2014-10-14 14:22:32

标签: bash shell error-handling mysqldump

我目前正在尝试编写一个脚本来备份我的几个网站及其数据库。

一切都运行良好,但我试图对我的日志更加聪明 - 基本上,目前它将尝试运行mysqldump并将回应成功或失败。

我宁愿做的是输出实际错误,而不仅仅是一个无用的mysqldump失败'信息。我已经环顾四周了,我几乎能够做到这一点,我想要使用" 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

这会将错误输出到我的日志文件中,但会覆盖其中的任何内容。这也意味着我的错误检查if语句是否没有收到错误。

我有什么方法可以:

a)从mysqldump函数中捕获实际错误(即该用户拒绝访问) b)将此错误附加到现有错误日志 c)在输出上述错误后也附加成功或失败消息

任何帮助都会很棒!

谢谢!

2 个答案:

答案 0 :(得分:8)

  

所以我添加了" 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可能会更好,但我不会改变这些部分。

答案 1 :(得分:4)

a)你可以在这样的变量中捕获错误输出:

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

b)您可以检查此变量的内容,照常显示消息,然后

c)您可以使用echo "$somevar" >> $LOG_LOCATION

轻松将其转发到日志文件中

此致