You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crontab仅收集错误日志异常:mongodump正常输出混入stderr

解决crontab备份脚本只存真正错误日志的问题

为啥mongodump正常输出会进错误日志?

mongodump本身就把进度、状态这类非错误信息输出到stderr,这是它的设计逻辑——避免和导出的二进制数据(走stdout)混在一起。所以你直接捕获脚本的stderr,自然会把这些正常内容也混进去。

几个可行的解决办法

1. 改脚本,单独处理mongodump的输出

在你的备份脚本里,针对mongodump命令做过滤,只把真正的错误行留下来:

# 替换你原来的mongodump命令,示例:
mongodump --db mydb --out /backup 2>&1 | grep -i "error" >> /root/scripts/err.log

要是想把mongodump的正常状态信息单独存一份,也可以这么写:

mongodump --db mydb --out /backup 2>&1 | tee >(grep -i "error" >> /root/scripts/err.log) >> /root/scripts/mongodump_status.log

2. 在crontab里直接过滤错误

不想改脚本的话,在crontab里加过滤,只把带错误关键词的行写入日志:

0 0 * * * /root/scripts/dev-vps_backup.sh 2>&1 > /dev/null | grep -i "error\|failed" >> /root/scripts/err.log

提示:这里的error、failed关键词你可以根据实际错误输出调整,别漏了真正的错误,也别把正常信息误抓进去。

3. 检查脚本里其他命令的输出

看看脚本里的zip之类的命令,确保它们的正常输出走stdout,错误走stderr。要是有其他命令也像mongodump这样乱输出,得单独处理。

你之前的crontab配置为啥没用?

  • 第一个配置>> logfile.log 2>&1 > /dev/null:逻辑是先把stdout写到logfile,再把stderr重定向到stdout(也就是logfile),最后又把stdout扔去/dev/null。实际效果是stderr会进logfile,stdout被丢了,但mongodump正常信息在stderr,所以会被写进去。
  • 第二个配置2>&1 >> all.log | tee -a all.log err.log >&2:逻辑绕来绕去,导致stdout和stderr交叉,反而把所有信息都混进了err.log。

内容的提问来源于stack exchange,提问作者hemant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:22:37