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