
実行可能ファイルがあり、次のように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
にオプションを追加すると、書き込みもバッファリングされません。python
stdout
環境変数を設定することで、Pythonプログラムに同じ動作を実行させることができますPYTHONUNBUFFERED
。他のプログラムでは利用可能unbuffer
~から予想されるパッケージまたはstdbuf
~からGNUコアツール(望むよりパイプラインでバッファリングをオフにする)。