如何将 cron stderr 发送到管道之间的脚本?

How do I send cron stderr to a script between pipes?

我有一些 MySQL 数据库,我每晚从 cron 备份,只是你的标准 mysqldump 命令。我只想将来自 mysqldump and/or aws 的错误提供给一个脚本,然后该脚本会将错误发送到 slack。不过,我正在努力弄清楚如何在命令中间执行此操作。我想将 stderr 发送到 slacktee,但要发送到 gzip 并继续发送到 aws s3 cp。所以这很好用:

* * * * * mysqldump --host=mysql.example.com --user=mysql | gzip | aws s3 cp - s3://backs/backs/whatever.sql.gz

这只是通常的普通 ol' 备份。但是我试图在 stderr 重定向中压缩 mysqldump 命令失败,我已经尝试了 2>&1 的所有组合,但每个组合都没有成功。每个组合要么以空 gzip 文件结尾,要么停止 运行.

中的所有内容

* * * * * mysqldump --host=mysql.example.com --user=mysql dbname 2>&1 >/dev/null | /usr/local/bin/slacktee | gzip | aws s3 cp - s3://backs/backs/whatever.sql.gz

因此,如果 mysqldump 命令出现错误,则仅将错误发送至 /usr/local/bin/slacktee 如果没有错误,则仅将 mysqldump 输出发送至 gzip 管道。

我想要和 aws s3 cp 一样的东西,但这似乎更容易,我可以把重定向放在最后。

编辑添加:理想情况下,我希望避免为此编写一个单独的脚本并将其全部保存在 cron 中的一行中。

同时添加另一个编辑。 2>&1 /dev/null 只是在这个例子中,我尝试在不同的地方制作 2>&1 /path/to/slacktee 以及 2>1> 的不同组合以及一些 |好吧,还有我能想到的所有其他不同方法,但那也行不通。

我会创建一个单独的脚本,(mysqlbackup.sh),并将 crontab 更改为:

* * * * * mysqlbackup.sh

您的脚本可能看起来像(未经测试):

#!/bin/bash

mysqldump --host=mysql.example.com --user=mysql dbname 2>/tmp/errors | gzip > /tmp/mysqldump.gz

if [ -s /tmp/errors ];  # if file has a size
then
        echo "Something went wrong"
else
        echo "OK"
fi

这当然需要用 aws s3 cp... 内容进行扩展...