表示する必要があるのは、定期的に更新されるログです。これは約 10 行のテキスト ブロックです。私は |tee を使用しており、現在は正常に動作しています。ただし、パフォーマンスはあまり満足のいくものではありません。しばらく待機してから、複数の更新からいくつかのテキスト ブロックを出力します (特にプログラムが起動したばかりのときは、コンソールに何かが表示されるまでにかなり時間がかかり、これを初めて見たとき、プログラムがハングしていると思いました)。さらに、最後のブロックの途中でランダムに中断するため、表示が非常に見苦しくなります。
これを改善する方法はありますか? (毎回の出力を減らして、出力ファイルとコンソールをより頻繁に切り替えるなど)
アップデート: 現在私の bash スクリプトの内容は次のとおりです:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
答え1
あなたの問題はパイプの基本的な機能、つまりバッファリングから生じていると思います。
回避策は面倒ですが、unbuffer
またはscript
または などのコマンドを確認する必要がありますstdbuf
。
おそらく、次のように tee による出力バッファリングを停止するものがあります:
your_program | stdbuf -o0 tee
PS. 今はコンソールにいないので、これを試すことができません。
答え2
私はコマンドのグループ化を使用し、出力をプロセス置換にリダイレクトします。内部では、それを /dev/tty と stdout にエコーします。次に、stdout と stderr をファイルにリダイレクトします。これまでのところ、うまく機能しています。必要に応じて、出力の先頭にタイムスタンプとプロセス識別子を簡単に追加できます。
{
#script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1
答え3
script
走る
$ script -c "your_program" result.log
の代わりに
$ your_program | tee result.log
例えばscript -c "ls" result.log
。
ところで:コマンド で開始して終了する
script
bash セッション全体を記録できます 。script result.log
exit
この回答は @curious_cat によって既に含まれており、この質問に対する回答と同じです:bashセッションの記録