stdoutをファイルにリダイレクトするときにGNUタイムアウトを使用する

stdoutをファイルにリダイレクトするときにGNUタイムアウトを使用する

実行可能ファイルがあり、次のようにSTDOUTとSTDERRを別々のファイルに書き込もうとしているとします。

python write.py > out 2> err

このコマンドをGNUで使用すると、timeout私のoutファイルは常に空です。なぜこれが起こるのですか?この問題をどのように解決できますか?

timeout 5s python write.py > out 2> err

write.py 例:

#!/bin/bash
import sys, time

i = 0
while True:    
    print i
    print >> sys.stderr, i
    time.sleep(1)
    i += 1

ベストアンサー1

$ timeout 5s python write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:12 err
-rw-r--r-- 1 yeti yeti  0 Apr  6 08:12 out
$ timeout 5s python -u write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 out
$ cmp err out && echo same
same
$ cat out 
0
1
2
3
4

pythonではバッファリングされた書き込みを使用しますstdoutが、使用しないでくださいstderr。したがって、作成されたすべてのコンテンツはsys.stderrすぐに作成されますが、forの内容は、sys.stdout書き込み操作を最小限に抑えるためにバッファがいっぱいになるまでバッファに保持されます。 5秒以内に一度の書き込みでもバッファが満たされず、インタプリタがtimeout終了します。python

呼び出し-uにオプションを追加すると、書き込みもバッファリングされません。pythonstdout

環境変数を設定することで、Pythonプログラムに同じ動作を実行させることができますPYTHONUNBUFFERED。他のプログラムでは利用可能unbuffer~から予想されるパッケージまたはstdbuf~からGNUコアツール(望むよりパイプラインでバッファリングをオフにする)。

おすすめ記事