ファイルロガーを使用すると、stderrはstdoutの前にフラッシュされます。

ファイルロガーを使用すると、stderrはstdoutの前にフラッシュされます。

私のPythonコード:

import sys
print "i am a daemon"
print "i will be run using nohup"
sys.stderr.write("i am an error message inside nohup process\n")

コードを実行すると、python a.py次のように表示されます。

i am a daemon
i will be run using nohup
i am an error message inside nohup process

コードを実行すると、nohup python a.py > a.log 2>&1 < /dev/null &a.logが表示されます。

i am an error message inside nohup process
i am a daemon
i will be run using nohup

stdoutログを使用するとstderrログがフラッシュ/記録されるのはなぜですかnohup

ベストアンサー1

私はそれが重要ではないと思いますnohup。これにより同じ動作が発生しますpython a.py > a.log 2>&1

Pythonは内部的にCファイルstdioを使用する可能性が高いです。これにより、stdout端末にいるときにラインバッファリングが発生し、stdoutファイルのときにバッファリングが発生します。stderr常にバッファリングされません。

stdoutファイルにリダイレクトすると、stdoutバッファリングがラインバッファリングからバッファリングに切り替わり、printed文字列がバッファに入り、プログラム(ストリーム)が閉じられたときにのみフラッシュされます。ストリームはstderrバッファリングされないため、ファイルに高速に転送されます。

stdbufadjustStandardBufferingを使用して、行を正しい順序で強制的に印刷できます。

stdbuf -o0 python a.py  >a.log 2>&1

おすすめ記事