我正在调试一个有死锁倾向的程序。在它运行良好的情况下,./program > log
或者./program | tee log
保存输出的副本但如果我执行其中任何一个,如果程序死锁并且我用^C
(SIGINT)杀死它,那么日志总是空的。我知道程序已经向标准输出写入了一些东西,因为这发生在任何东西都可能卡住的部分之前,而且确实当我刚刚运行时,我./program
在终端中看到了输出。
我想要一种tee
输出方式,这样如果我必须终止程序,到目前为止的输出仍然保存在日志文件中。我的外壳是 bash。
许多(大多数?)程序,以及几乎所有 C 或 C++ 程序,当标准输出是管道或磁盘文件时, “完全”缓冲标准输出,或者通常不是isattty()
,并且当您终止时,任何输出仍在缓冲区中并且不会刷新到操作系统它丢失了。程序通常不会对 stderr 进行缓冲,这就是它起作用的原因。
一般使用stdbuf -oL program ...
或可能-o0
。有些程序有自己的私有选项,例如 GNU sed 有-u/--unbuffered
。
或者使用在 pty 下运行程序的东西,从而关闭缓冲,包括script
、或其简化形式、 或。screen
expect
unbuffer
ssh -t
有关更多详细信息和选项,请参阅关闭管道中的缓冲