我正在尝试调试生成大量数据的程序。但是我想要调试的事件发生在一段随机的时间之后(我不能强迫它)。因此,我需要在shell中看到stdout和stderr并将相同的输出保存到文件中,以便在我看到shell输出时需要进一步分析和中断时。
我找到了 script
这个命令 问Ubuntu线程 但是我无法让它工作,脚本说:
$ script "./client -p 4242 -n test"
Script started, output file is ./client -p 4242 -n test
然后退出。该文件包含:
Script started on Thu Jun 26 13:51:12 2014
Script done on Thu Jun 26 13:51:12 2014
所以 script
不起作用 。该 ./client
file是一个python脚本。我也尝试用它启动它 $ python client -p 4242 -n test
但它也没有用。
我也在同一个帖子上看到了一些答案 tee
和管道,但我不能让它输出到我的shell,看看发生了什么:
$ ./client -p 4242 -n test | tee output.log
给了我一个等待光标,没有任何事情发生。 所以 tee
不起作用 。
有没有其他解决方案,或者我注定要等待并在一段时间后中断程序,并希望它经历了我正在寻找的事件?
非常感谢你的帮助!
附:我在使用zshell(使用oh-my-zsh),Mac OSX 10.9.3,Python 2.7.5
编辑: 我可能不得不提到我正在使用 multiprocessing
模块和 ./client
脚本启动多个其他 Process
ES。可能是因为这个原因吗?我仍然不明白为什么它不会抓住 ./client
过程输出...
EDIT2: 我尝试了下面Matteo的答案(非常感谢你的帮助),它一直变得陌生和陌生:
如果进程失败(服务器关闭),我可以看到输出:
$ ./client -p 4242 -n test 2>&1 | tee output.log
Process Process-1:
Client # 1: Could not connect to server. Stopping.
Spawner: New client # 1 started...
Done.
$
但如果看起来它正在运行,我什么也看不见:
$ ./client -p 4242 -n test 2>&1 | tee output.log
^C [voluntary interrupt after a lot of waiting]
$ cat output.log
$
在上面的日志中(失败的地方),您可以看到新进程打印 之前 主要的( Spawner
)即使它在它之后开始。所以它看起来像一些非常奇怪的输出魔法。
print
来自Python的声明(2.7.5)。
tee
和script
没有捕获程序的输出,那么程序可能正在做一些比仅写入stdout / stderr更“聪明”的事情。它可能正在写入/ dev / tty,或者当stdout / stderr不是TTY时它可能会改变它的行为。