Cron执行Shell脚本可发邮件,mysqldump无输出邮件(Nullmailer)
Cron任务中mysqldump无邮件通知的问题解决
问题场景
我在服务器配置了两个Cron定时任务:
- 执行Shell脚本的任务,能正常触发
MAILTO发送执行结果邮件 - 执行mysqldump备份的任务,备份文件正常生成,但始终没有邮件通知,更换MTA(Nullmailer、msmtp)后问题依旧
Cron任务示例:
43 16 * * * /var/backups_scripts/backups 46 16 * * * /usr/bin/mysqldump --login-path=bds-server --single-transaction database_name | /bin/gzip > /var/backups/bd_backup_$(/bin/date +\%d\%m\%Y_\%H\%M\%S).sql.gz
已在crontab -e中配置MAILTO参数,MTA终端测试正常。
问题原因
Cron的邮件通知机制仅在任务产生**标准输出(stdout)或标准错误(stderr)**时才会触发。你的mysqldump任务中:
- 标准输出(stdout)被管道传递给
gzip,最终重定向到备份文件,没有内容输出到Cron的stdout - 若mysqldump执行成功,标准错误(stderr)也没有输出内容
因此Cron认为任务无输出,不会发送邮件。而Shell脚本任务包含输出语句(如echo),所以能触发邮件。
解决方案
通过强制生成输出内容,让Cron捕获到输出从而发送邮件,以下两种方案任选:
方案一:直接输出执行状态及错误信息
修改mysqldump的Cron任务为:
46 16 * * * /usr/bin/mysqldump --login-path=bds-server --single-transaction database_name 2>&1 | /bin/gzip > /var/backups/bd_backup_$(/bin/date +\%d\%m\%Y_\%H\%M\%S).sql.gz && echo "数据库备份成功:/var/backups/bd_backup_$(/bin/date +\%d\%m\%Y_\%H\%M\%S).sql.gz" || echo "数据库备份失败,错误信息:"
2>&1:将stderr重定向到stdout,确保mysqldump的错误信息能被Cron捕获&&/||:分别在备份成功/失败时输出提示信息,保证Cron始终有输出内容
方案二:单独记录错误日志并输出结果
如果需要保留错误日志文件,可使用以下命令:
46 16 * * * ( BACKUP_FILE="/var/backups/bd_backup_$(/bin/date +\%d\%m\%Y_\%H\%M\%S).sql.gz" ERROR_LOG="/var/backups/mysqldump_errors_$(/bin/date +\%d\%m\%Y_\%H\%M\%S).log" /usr/bin/mysqldump --login-path=bds-server --single-transaction database_name | /bin/gzip > "$BACKUP_FILE" 2>"$ERROR_LOG" if [ -s "$ERROR_LOG" ]; then echo "数据库备份失败,错误日志文件:$ERROR_LOG" cat "$ERROR_LOG" else echo "数据库备份成功,备份文件:$BACKUP_FILE" rm "$ERROR_LOG" fi )
- 备份文件和错误日志都添加时间戳,便于排查
- 若错误日志非空(即备份出错),输出错误信息;否则输出成功提示并删除空日志
验证方法
- 手动执行修改后的命令,确认终端有输出内容
- 等待Cron到点执行,检查
MAILTO指定的邮箱是否收到通知邮件
内容的提问来源于stack exchange,提问作者EWSG
相关产品推荐
相关产品推荐

