【笔记】Linux环境下使用tee记录python程序的标准错误输出stderr

问题描述

我想要运行一个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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux系统中,标准输入(stdin)、标准输出stdout)和标准错误stderr)是三个常用的输入输出设备。 标准输入设备(stdin)是用于接收用户输入的设备。在Linux终端中,通常使用键盘作为标准输入设备。用户可以通过向程序提供输入数据,与程序进行交互。比如,当我们在终端输入命令时,输入的内容就是通过标准输入设备传递给程序的。 标准输出设备(stdout)是用于向用户显示输出信息的设备。在Linux终端中,默认情况下,标准输出设备就是终端屏幕。程序中通过调用输出函数,将需要显示的信息发送到标准输出设备上。例如,我们在终端执行一个命令时,命令的输出结果就会显示在标准输出设备上。 标准错误设备(stderr)用于输出错误信息。和标准输出设备类似,标准错误设备默认情况下也是终端屏幕。程序可以通过将错误信息发送到标准错误设备上,通知用户当前程序执行遇到了错误或异常。与标准输出不同的是,标准错误输出可以与标准输出分开。可以将标准输出保存到文件中,并将标准错误信息显示在终端上,或者将标准错误重定向到另外一个文件中。 使用这些标准输入输出设备,可以使程序与用户进行交互,接收输入数据,展示输出结果,并及时通知用户错误信息。同时,通过将标准输出标准错误输出重定向到不同的位置,可以方便地进行日志记录错误排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值