如何为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
相关产品推荐
相关产品推荐

