我有一个 cron 作业,它运行 python 脚本并仅将 stderr 写入日志文件。
* * * * * python /home/hydro/cron.py 2>> /home/hydro/uhoh.log
我想要的是它附加到日志文件的每一行的时间戳。我正在努力弄清楚如何仅使用 stderr 来做到这一点;我找到了多种使用
2>&1
处理 stderr 和 stdout 的解决方案,但这不是我想要的。我按照
这篇文章尝试了这样的事情: 时间戳.sh
#!/bin/bash
while read x; do
echo -n `date +%d/%m/%Y\ %H:%M:%S`;
echo -n " ";
echo $x;
done
我的计划任务:
* * * * * python /home/hydro/cron.py 2 | /home/hydro/timestamp.sh >> /home/hydro/uhoh.log
这会邮寄错误并创建一个
uhoh.log
文件,但不向其中写入任何内容。这是我收到的邮件...
/home/hydro/timestamp.sh: line 1: syntax error near unexpected token `most'
/home/hydro/timestamp.sh: line 1: `Traceback (most recent call last):'
Traceback (most recent call last):
File "/home/hydro/cron.py", line 2, in <module>
x = 10/0
ZeroDivisionError: division by zero
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe
我也尝试过这个:
* * * * * python /home/hydro/cron.py 2> | /home/hydro/timestamp.sh >> /home/hydro/uhoh.log
这会产生一个语法错误,该错误会邮寄给我。没有产生
uhoh.log
。
我想要的可能吗?还是 stderr 必须与 stdout 结合起来?
* * * * * python /home/hydro/cron.py 2>&1 1>/dev/null | /home/hydro/timestamp.sh >> /home/hydro/uhoh.log
这会将 stderr 重定向到 stdout 所在的位置。然后它将 stdout 重定向到“黑洞”,即 /dev/null。这意味着只剩下 stderr,它通过管道传输到我的时间戳脚本并最终附加到日志文件中。
我最终将 stderr 发送到我的日志文件,并且 stderr 或 stdout 都没有发送到邮件。