【笔记】Linux环境下使用tee记录python程序的标准错误输出stderr
问题描述我想要运行一个python程序,要求:print输出显示在屏幕上和保存到文件中;想同时记录标准输出(stdout)和标准错误(stderr)。下文仅针对print进行输出设置,不涉及logging库。方式1:2>&1 >log.txt(不行)使用2>&1将stderr合并到stdout,同时保存结果到文件log.txt。cmd 2>&1 &g
问题描述
我想要运行一个python程序,要求:
- print输出显示在屏幕上和保存到文件中;
- 想同时记录标准输出(stdout)和标准错误(stderr)。
下文仅针对print进行输出设置,不涉及logging库。
方式1:2>&1 >log.txt(不行)
使用2>&1将stderr合并到stdout,同时保存结果到文件log.txt。
cmd 2>&1 >log.txt
与nohup搭配使用使得程序后台运行
nohup cmd 2>&1 >log.txt &
最后的&
表示后台运行。这也是常用的挂后台程序的命令。
方式1不能满足我的要求1。
方式2:使用命令tee
tee
命令可以实现要求1和2,使得输出同时显示在屏幕上和保存至文件。
cmd 2>&1 | tee log.txt
# 或
cmd |& tee log.txt
输出和错误分两个文件
cmd > >(tee out.log) 2> >(tee err.log)
小插曲
关于tee -i
:我开始使用Ctrl+C
中断作为错误测试tee
命令,发现方式2无法记录KeyboardInterrupt
异常,就以为方式2不行,但测试了一下AssertError
是可以被记录的。
原因:tee
命令有一个参数-i
是用来忽视中断异常的,添加了-i
之后,tee
会忽略中断(意思是tee命令不会被打断),继续记录cmd程序之后的输出。而如果不加-i
参数,在执行中断之后,tee
也就停止记录了,这也是为什么我在之前的测试中无法记录中断错误的原因,tee
的记录也被打断了。
资料
[1] https://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-with-a-pipe
[2] https://phoenixnap.com/kb/linux-tee
更多推荐
所有评论(0)