script

script

表示する必要があるのは、定期的に更新されるログです。これは約 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

ところで:コマンド で開始して終了する scriptbash セッション全体を記録できます 。script result.logexit

この回答は @curious_cat によって既に含まれており、この質問に対する回答と同じです:bashセッションの記録

関連情報