web-dev-qa-db-ja.com

Bash:teeよりもコンソールと出力ファイルの両方に出力するためのより良い方法?

表示する必要があるのは、定期的に更新されるログです。これは、約10行のテキストのブロックです。 | teeを使用していますが、現在は機能しています。ただし、パフォーマンスは満足のいくものではありません。しばらく待ってから、複数の更新から数ブロックのテキストを出力します(特に、プログラムが起動したばかりの場合、コンソールに何かを表示し始めるのにかなりの時間がかかり、これを初めて見たとき、プログラムがハングしていると思いました)。また、最後のブロックの途中でランダムに壊れるので、提示するのはかなり醜いです。

これを改善する方法はありますか? (たぶん、毎回出力が少なくなり、出力ファイルとコンソールをより頻繁に切り替えますか?)

更新:これが私のbashスクリプトの現在の内容です:tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

2
tmp

あなたの問題は、パイプの基本的な機能、つまりバッファリングから生じていると思います。

回避策は面倒ですが、unbufferまたはscriptまたはstdbufのようなコマンドを確認する必要があります。

おそらく、次のようにteeによる出力バッファリングを停止するための何か:

 your_program | stdbuf -o0 tee

PS。私は今コンソールにいないので、これを試すことはできません。

1
curious_cat

コマンドグループ化を使用して、出力をプロセス置換にリダイレクトします。内部では、それを/ 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 
0
wackazong