如何在 bash 脚本中捕获 mysqldump 错误? [复制]
Posted
技术标签:
【中文标题】如何在 bash 脚本中捕获 mysqldump 错误? [复制]【英文标题】:How to catch mysqldump error in bash script? [duplicate] 【发布时间】:2019-02-12 03:05:07 【问题描述】:mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended-
insert --single-transaction --add-drop-database --opt $dbname --
user=$dbusername --password=$dbpassword | gzip -1 > $filename.sql.gz
echo $?
我在我的 bash 脚本中使用上面的代码来获取一个 mysql 转储并 gzip 它。
我想在允许脚本继续运行之前确认 mysqldump 是否成功。例如,如果找不到主机,我该如何捕捉该错误?
我不确定如何实现这一点。我用上面得到的当前输出如下:
mysqldump: Got error: 2005: Unknown MySQL server host 'test' (0) when
trying to connect
0
为什么找不到主机时我得到一个 0 成功代码?我认为这是因为 gzip 仍然成功,因为它会生成一个空文件......但我不知道如何解决这个问题。
【问题讨论】:
linuxcommand.org/lc3_wss0140.php 显示你的整个脚本 为什么是-1
而不是-9
?我的意思是如果你想压缩它,你可能希望它压缩。
【参考方案1】:
当使用管道(|)时,只捕获管道最后一条命令的退出值。但是我们可以使用set -o pipefail
来解决这个问题。这将捕获管道中的非零退出代码
让你的 schell 脚本总是这样
#!/bin/bash
set -o pipefail
示例:
C02MLC76FD57:~ vkrishna$ cat testing.sh
#!/bin/bash
set -o pipefail
false | echo "hello world"
echo $?
C02MLC76FD57:~ vkrishna$ ./testing.sh
hello world
1
false
的退出状态始终为 1。
(或)
你也可以使用PIPESTATUS
如下
$ false | true
$ echo "$PIPESTATUS[0] $PIPESTATUS[1]"
1 0
我更喜欢在 shell 脚本中使用 set -o pipefail
。
和
关于捕获错误,在执行脚本时将stderr重定向到文件以捕获实际错误。
示例: 文件名为backup.sh
./backup.sh 2>/tmp/backupError.log
这样,如果备份有效,一切正常,如果失败,我们会捕获错误。
【讨论】:
【参考方案2】:你的意思是这样的
#!/bin/bash
mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended-
insert --single-transaction --add-drop-database --opt $dbname --
user=$dbusername --password=$dbpassword | gzip -1 > $filename.sql.gz
if [ "$?" -eq 0 ]; then
echo "mysqldump command Successful"
else
echo "mysqldump encountered an Error"
fi
您可以执行以下操作来检查 mysql 错误并继续 gzip 压缩
#!/bin/bash
mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended-
insert --single-transaction --add-drop-database --opt $dbname --
user=$dbusername --password=$dbpassword > db.dump
if [[ $? -eq 0 ]]; then
gzip db.dump
else
echo >&2 "DB backup failed"
exit 1
fi
【讨论】:
是的,但是,我总是收到一条成功的消息,因为 gzip 命令是最后一个运行的命令,即使 mysqldump 失败也是成功的。 @gurpsone 检查我的答案。我已经更新了。以上是关于如何在 bash 脚本中捕获 mysqldump 错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章