![邮件 stderr 输出,在 cron 中记录 stderr+stdout](https://linux22.com/image/143620/%E9%82%AE%E4%BB%B6%20stderr%20%E8%BE%93%E5%87%BA%EF%BC%8C%E5%9C%A8%20cron%20%E4%B8%AD%E8%AE%B0%E5%BD%95%20stderr%2Bstdout.png)
我希望 cron 仅邮寄 stderr 输出,同时以正确的顺序将 stdout+stderr 记录到文件中。
我一直在摆弄T恤之类的东西,但不太对劲......
把命令包装成shell脚本就可以了
喜欢
#!/bin/bash
mycommand | maybe_some_shell_redirect_magic >> /var/log/mycommand.log
答案1
我认为这是可能的 - 同时保持行排序(即 stderr 是从写入它的进程内复制的),即使使用 POSIX shell。尝试 :
#!/bin/sh
exec 3>log
command args ... 2>&1 >&3 |while read err; do
echo "$err" >&2
echo "$err" >&3
done
答案2
在分离 stdout 和 stderr 时不可能准确地保持顺序。只要 stdout 和 stderr 输出的时间不太接近,您就可以获得合理的结果:
mycommand 2>>/var/log/mycommand.log | tee -a /var/log/mycommand.log
您可以使用此脚本代替 mycommand 进行测试:
#!/bin/bash
echo stdout 1
sleep 0.1
echo stderr 1 >&2
sleep 0.1
echo stdout 2
sleep 0.1
echo stderr 2 >&2
如果删除 sleep 命令,日志文件中的顺序会有些混乱。