Pythonスクリプトがあるとしましょう。script.py
from time import sleep
for i in range(3):
print(i)
sleep(1)
print('done')
次のsshコマンドを使用してリモートサーバーで実行したいと思います。
ssh me@server "python script.py"
0 1 2 done
上記の内容をそのまま実行すると、スクリプトを起動してから3秒後に出力全体が表示されます。代わりに、スクリプトによって生成された出力をすぐに見たいです。つまり、0
- 1秒後 - 1
- 1秒後 - 2
- 1秒後 - done
。
ログファイルの表示に関する同様の質問を見たことがありますが、これを行う簡単な方法はありますか(たとえば、サーバー上のファイルへの中間ロギングなし)
ベストアンサー1
プログラムがuinxのstdoutに出力を送信すると、出力は通常I / Oパフォーマンスを最適化するためにバッファリングされます。バッファリングモードは通常、プログラムが実行される状況に応じて選択される。
UNIX で対話型セッションを開始すると、セッションは通常ラインバッファリングされます。つまり、プログラムが改行文字を出力するとバッファがフラッシュされます。
プログラムがファイルコンテキスト(たとえば、stdoutはファイル)、または時にはパイプコンテキストで始まるときに通常ブロックバッファリングされます。つまり、ブロックがいっぱいになるまで(通常8192バイト)書き込まれません。
プログラムは、必要に応じて標準出力をフラッシュするか、バッファリングモードを直接変更することによって、この設定を内部的に変更できます。残念ながら、これに対するPythonのサポートは悪くも存在もしません。
コマンドでプログラムを起動して、外部でバッファリングモードを変更できますstdbuf
。
たとえば、
ssh me@server "stdbuf -oL python script.py"
必要な操作を実行するには、強制的にラインバッファリングを実行する必要があります。