如何在 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 错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

捕获信号时如何正确等待bash子进程完成

如何在 shell 脚本中捕获 Gradle 退出代码?

在 bash 脚本中将 SSH 输出捕获为变量

识别 Bash 脚本中文件扩展名的正则表达式模式不准确以捕获压缩文件

在脚本中通过ssh捕获bash脚本的输出

如何将curl的输出捕获到bash中的变量[重复]