デバッグとプロセスの情報を標準出力に出力する、長時間実行されるバッチプロセスがあります。端末から実行するだけなら、「現在の場所」を追跡できますが、データが多すぎて画面からスクロールしてしまいます。
出力をファイル '> out.txt'にリダイレクトすると、最終的に出力全体が取得されますが、バッファリングされているため、現在何をしているかがわかりません。
出力をリダイレクトする方法はありますが、書き込みをバッファリングしないようにしますか?
デバッグとプロセスの情報を標準出力に出力する、長時間実行されるバッチプロセスがあります。端末から実行するだけなら、「現在の場所」を追跡できますが、データが多すぎて画面からスクロールしてしまいます。
出力をファイル '> out.txt'にリダイレクトすると、最終的に出力全体が取得されますが、バッファリングされているため、現在何をしているかがわかりません。
出力をリダイレクトする方法はありますが、書き込みをバッファリングしないようにしますか?
回答:
setvbuf
Cの呼び出しを使用して標準ストリームのバッファリングオプションを明示的に設定できます(このリンクを参照)が、既存のプログラムの動作を変更しようとする場合はstdbuf
(coreutils
バージョン7.5以降のように見える)を試してください。
これはstdout
1行までバッファリングします。
stdbuf -oL command > output
これにより、stdout
バッファリングが完全に無効になります。
stdbuf -o0 command > output
./configure && make
運賃です。後でインストールする必要さえありません。stdbuf
バイナリoffを使用するだけsrc/
です。
script
次のようなコマンドを使用して、ファイルへの行バッファー出力を実現できます。
stty -echo -onlcr # avoid added \r in output
script -q /dev/null batch_process | tee output.log # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log # Linux
stty echo onlcr
batch_process
追加&
すると、コマンドはすぐに終了します)。非常に一般的なユースケースのように、およびb)この呪文がどのように機能するかについての説明はここにはありません。
私が見つけた最も簡単な解決策(サードパーティのパッケージをインストールする必要はありませんでした)は、Unix&Linuxサイトの同様のスレッドで言及されています:script
コマンドを使用します。それは古く、おそらく既にインストールされています。
$ script -q /dev/null long_running_command | print_progress # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress # Linux
コマンドの最初のファイル名パラメータscript
は、書き込まれるログファイルであることに注意してください。単に実行script -q your_command
すると、インデントしたコマンドを実行してログファイルで上書きします。man script
試す前に、安全であることを確認してください。
出力をファイルにリダイレクトし、ファイルの後にtail -f
コマンドを続けます。
編集
それでもバッファリングの影響を受ける場合は、syslog機能(通常はバッファリングされていない)を使用します。バッチプロセスがシェルスクリプトとして実行される場合は、loggerコマンドを使用してこれを実行できます。バッチジョブがスクリプト言語で実行される場合、とにかくログ機能が必要です。
This answer is useful
ず、おそらく役に立たない答えのために地獄は誰を配りますか?
tee
魔法のコマンドを使用できます!
someCommand | tee logFile.log
意志の両方のログファイルへのコンソールと書き込みの表示が。
tee
バッファリングの実行を停止しません。
tee
バッファリングは避けられませんが、出力が何であるかを見ることができるだけです。これは@JamesDeanが望んでいたことです(私は彼の質問を取り消すように)が、ここではバッファリングは本当に問題ではないと思います。詳細がありましたら、お知らせください。
tee
を取得していませんが、取得していない出力をよりよく見るために使用することをお勧めしますか?
>
は、コンソールに何も表示されません。@JamesDeanはそれを説明するために「バッファリング」という言葉を使用していると思います。彼が何を望んでいるのかについて、彼に質問するためのコメントを投稿します。