如何在 bash 脚本中捕获 mysqldump 错误?
How to catch mysqldump error in bash script?
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。
我想在允许脚本继续 运行 之前确认 mysql 转储成功。例如,如果找不到主机,我该如何捕获该错误?
我不确定如何实现。我从上面得到的当前输出如下:
mysqldump: Got error: 2005: Unknown MySQL server host 'test' (0) when
trying to connect
0
为什么找不到主机时我得到的是 0 成功代码?我认为这是因为 gzip 仍然成功,因为它生成了一个空文件...但我不知道如何解决这个问题。
你的意思是这样吗
#!/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
使用管道(|)时,只捕获管道最后一条命令的退出值。但是我们可以通过使用 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
如果备份有效,一切正常,如果失败,我们会捕获错误。
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。
我想在允许脚本继续 运行 之前确认 mysql 转储成功。例如,如果找不到主机,我该如何捕获该错误?
我不确定如何实现。我从上面得到的当前输出如下:
mysqldump: Got error: 2005: Unknown MySQL server host 'test' (0) when
trying to connect
0
为什么找不到主机时我得到的是 0 成功代码?我认为这是因为 gzip 仍然成功,因为它生成了一个空文件...但我不知道如何解决这个问题。
你的意思是这样吗
#!/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
使用管道(|)时,只捕获管道最后一条命令的退出值。但是我们可以通过使用 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
如果备份有效,一切正常,如果失败,我们会捕获错误。