次のコマンドを使用して、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
動作します。(人々のための単なる更新)
nohup
POSIXユーティリティであり、プラットフォームによって実装が異なる可能性があります。ところで、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=TRUE
PS- 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
現在のディレクトリが書き込み可能でない場合)。出力ファイル名を変更する方法がわかりません...