プログラムを終了してもシェル出力をファイルにリダイレクトする

プログラムを終了してもシェル出力をファイルにリダイレクトする

デッドロックに陥りやすいプログラムをデバッグしています。この場合、正常に実行すると出力コピーが保存されますが、これらのいずれかを実行するとプログラムデッドロックが発生し./program > log(SIGINT)で終了すると、ログは常に空になります。私はプログラムが標準出力に何かを書いたことを知っています。なぜなら、これは詰まることがあるどの部分よりも先に起こるからです。そして実際に実行すると、端末で出力を見ることができます。./program | tee log^C./program

teeプログラムを終了する必要がある場合は、これまでの出力をログファイルに保存するように出力する方法が必要です。私のシェルはbashです。

答え1

多くの(ほとんど?)プログラム、ほぼすべてのCまたはC ++プログラム、「完全な」バッファリングパイプまたはディスクファイルであるか、通常はそうでない場合はstdoutです。バッファにあり、isattty()それを終了するとオペレーティングシステムにフラッシュされていないすべての出力は失われます。プログラムは通常 stderr をバッファリングしないので動作します。

一般的な用途stdbuf -oL program ...または可能です-o0。一部のプログラムには、GNU sedなどの独自のプライベートオプションがあります-u/--unbuffered

または、ptyでプログラムを実行することを使用してバッファリングをオフにするか、短縮script形式screenまたは 。expectunbufferssh -t

詳細とオプションについては、以下を参照してください。パイプラインでバッファリングをオフにする

関連情報