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

如何为Cron任务的仅stderr输出添加时间戳并写入文件?

解决方案:仅为Cron任务的stderr输出添加时间戳

你的需求完全可行,不需要合并stdout和stderr。下面先分析你之前的问题,再给出两种有效实现方式:

问题分析

你之前的Cron命令存在语法错误:

  • 2 | 和 2> | 都是无效的重定向写法,bash无法识别这种格式,导致语法错误或管道无法正确接收stderr内容。
  • 你的timestamp.sh脚本也存在缺陷:read x会丢失行首空格,echo $x会自动压缩空格并忽略特殊字符,应该用IFS= read -r x和echo "$x"来保证行内容完整。

方法1:无需单独脚本,直接用进程替换(推荐)

利用bash的进程替换特性,直接在Cron命令中处理stderr,无需额外脚本:

* * * * * python /home/hydro/cron.py 2> >(while IFS= read -r line; do echo "$(date +'%d/%m/%Y %H:%M:%S') $line"; done >> /home/hydro/uhoh.log)
  • 2> >(...):将stderr的输出传递给括号内的while循环处理
  • IFS= read -r line:完整读取每一行(包含空格、特殊字符)
  • date +'%d/%m/%Y %H:%M:%S':生成指定格式的时间戳,和原日志行拼接后追加到日志文件

方法2:修正脚本+正确重定向管道

如果你想保留timestamp.sh脚本,先修正脚本内容:

#!/bin/bash
while IFS= read -r x; do
    echo "$(date +'%d/%m/%Y %H:%M:%S') $x"
done

然后修改Cron命令,将stderr单独导向管道,同时丢弃原stdout:

* * * * * python /home/hydro/cron.py 2>&1 >/dev/null | /home/hydro/timestamp.sh >> /home/hydro/uhoh.log
  • 2>&1:将stderr重定向到当前的stdout
  • >/dev/null:将原来的stdout输出丢弃(避免干扰)
  • 管道|此时仅接收stderr的内容,传给脚本添加时间戳后写入日志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:22