问题描述

我想要运行一个python程序,要求:

  1. print输出显示在屏幕上和保存到文件中;
  2. 想同时记录标准输出(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

Logo

更多推荐