tail を使ってファイルに何かが書き込まれるのをリアルタイムで監視する

tail を使ってファイルに何かが書き込まれるのをリアルタイムで監視する

ゆっくりと出力を生成する Python プログラムがあります。

それをファイルにキャプチャしたいのですが、tail を使用してライブで視聴することもできると思いました。

そこで、1つのターミナルで以下を実行します:

python myprog.py > output.txt

別の端末では:

tail -f output.txt

しかし、Python プログラムの実行中は tail に何も表示されないようです。

Ctrl + C を押して Python スクリプトを終了すると、突然末尾がoutput.txtいっぱいになり始めます。ただし、Python の実行中はそうではありません。

何が間違っているのでしょうか?

答え1

生成時にパイプされるように、バッファを明示的にフラッシュする必要がある場合もあります。これは、出力は通常、パイプのバッファがいっぱいになったとき (キロバイト単位だと思います) と標準入力メッセージが終了したときにのみ印刷されるためです。これはおそらく、読み取り/書き込みを節約するためです。これは、すべての印刷の後に、またはループしている場合はループ内の最後の印刷の後に実行できます。

import sys
...
print('Some message')
sys.stdout.flush()

答え2

バッファなしフラグを使用して Python を実行します。

python -u myprog.py > output.txt

出力はリアルタイムで印刷されます。

答え3

ライブ ファイルを tail する代わりに、tee代わりに を使用します。これは、まさにあなたがしようとしていることを実行するように作られています。

からマンティー:

tee(1) - Linux マニュアルページ

名前 tee - 標準入力から読み取り、標準出力とファイルに書き込む

概要

tee [OPTION]... [FILE]...

説明

標準入力を各 FILE にコピーし、標準出力にもコピーします。

-a, --append  
   append to the given FILEs, do not overwrite  
-i, --ignore-interrupts  
   ignore interrupt signals   
--help  
   display this help and exit  
--version
   output version information and exit

FILE が - の場合は、標準出力に再度コピーします。

したがって、あなたの場合は次のように実行します:

python myprog.py | tee output.txt

編集: 他の人が指摘しているように、この回答は、sys.stdout.flush()Davey の承認された回答で説明されているように python プログラムで が使用されない限り、OP が当初抱えていたのと同じ問題に遭遇します。この回答を投稿する前に行ったテストは、OP のユースケースを正確に反映していませんでした。

tee出力を表示しながらファイルに書き込むという代替方法として、最適とは言えないものの、Davey の回答が明らかに正しい、最良の回答です。

答え4

tail を使用すると、ほとんどの場合、ログ ファイル (電子メール メッセージなど) が追跡されます。

これは少し風変わりかもしれませんが、 Python コードでprint/ print()/を使用する代わりにwrite()、ロギング モジュールを使用してはいかがでしょうか? (PSL より) 注: ロギング フォーマッタは、従来のログに関連付けられたすべての時間と ID コードを出力しないように設定できます。

出力は (データ) ファイルに送信するように設定でき、バッファリングの遅延やリダイレクトがないため、tail は問題なく即時に動作します。

よろしく

関連情報