次のコマンドを使用して、Pythonスクリプトをバックグラウンドで実行しています。
nohup ./cmd.py > cmd.log &
しかし、nohupはログファイルに何も書き込んでいないようです。cmd.logは作成されますが、常に空です。Pythonスクリプトでは、標準出力に出力するsys.stdout.write代わりに使用printしています。私は何か悪いことをしていますか?
次のコマンドを使用して、Pythonスクリプトをバックグラウンドで実行しています。
nohup ./cmd.py > cmd.log &
しかし、nohupはログファイルに何も書き込んでいないようです。cmd.logは作成されますが、常に空です。Pythonスクリプトでは、標準出力に出力するsys.stdout.write代わりに使用printしています。私は何か悪いことをしていますか?
回答:
stdoutを定期的にフラッシュする必要があるようです(例:)sys.stdout.flush()。私のテストでprintは、プログラムが終了するまで、Pythonはこれを自動的に行いません。
python -uうまくいかない場合; nohup独自のバッファリングを導入している可能性があります。
nohup出力をバッファリングせず、正常にpython -u動作します。(人々のための単なる更新)
nohupPOSIXユーティリティであり、プラットフォームによって実装が異なる可能性があります。ところで、python3 I / OはもはやC stdioベースではありませんが、同様のバッファリング動作を持っています。
-uフラグを指定してPythonを実行すると、出力のバッファリングを回避できます。
nohup python -u ./cmd.py > cmd.log &
で使用する-u とnohupうまくいきました。を使用-uするとstdout、stderrストリームが強制的にバッファリングされなくなります。stdinには影響しません。すべてが「nohup.out」ファイルに保存されます。このような-
nohup python -u your_code.py &
ディレクトリに保存することもできます。こちらです-
nohup python -u your_code.py > your_directory/nohup.out &また、を使用することもできますPYTHONUNBUFFERED。空でない文字列に設定すると、-uオプションと同じように機能します。これを使用するには、Pythonコードを実行する前に以下のコマンドを実行します。
export PYTHONUNBUFFERED=1
または
export PYTHONUNBUFFERED=TRUEPS- cronジョブなどのツールを使用して、バックグラウンドで実行し、実行をスケジュールすることをお勧めします。
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &
または
nohup python -u ./cmd.py > cmd.log &
Python 3.3以降には、printへのflush引数があり、これが私にとって有効な唯一の方法です。
print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
同様の問題がありましたが、Pythonプロセスとは関係がありませんでした。nohupを実行するスクリプトを実行していて、そのスクリプトはcronを介して定期的に実行されました。
私は問題を解決することができました:
PS:私のスクリプトはRHELで実行されているkshで書かれました
nohupを使用していますか?BSDバージョンはnohup.out、現在のディレクトリで呼び出されたファイルに書き込みます(または$HOME/nohup.out現在のディレクトリが書き込み可能でない場合)。出力ファイル名を変更する方法がわかりません...