即使我终止程序,也将 shell 输出重定向到文件

5 bash signals stdout

我正在调试一个有死锁倾向的程序。在它运行良好的情况下,./program > log或者./program | tee log保存输出的副本但如果我执行其中任何一个,如果程序死锁并且我用^C(SIGINT)杀死它,那么日志总是空的。我知道程序已经向标准输出写入了一些东西,因为这发生在任何东西都可能卡住的部分之前,而且确实当我刚刚运行时,我./program在终端中看到了输出。

我想要一种tee输出方式,这样如果我必须终止程序,到目前为止的输出仍然保存在日志文件中。我的外壳是 bash。

dav*_*085 5

许多(大多数?)程序,以及几乎所有 C 或 C++ 程序,当标准输出是管道或磁盘文件时, “完全”缓冲标准输出,或者通常不是isattty(),并且当您终止时,任何输出仍在缓冲区中并且不会刷新到操作系统它丢失了。程序通常不会对 stderr 进行缓冲,这就是它起作用的原因。

一般使用stdbuf -oL program ...或可能-o0。有些程序有自己的私有选项,例如 GNU sed 有-u/--unbuffered

或者使用在 pty 下运行程序的东西,从而关闭缓冲,包括script、或其简化形式、 或。screenexpectunbufferssh -t

有关更多详细信息和选项,请参阅关闭管道中的缓冲