次のコマンドを使用して、バックグラウンドでpythonスクリプトを実行しています。
Nohup ./cmd.py > cmd.log &
しかし、Nohupはログファイルに何も書き込んでいないようです。 cmd.logは作成されますが、常に空です。 pythonスクリプトでは、print
の代わりにsys.stdout.write
を使用して標準出力に出力しています。私は何か間違っていますか?
Stdoutを定期的にフラッシュする必要があるようです(例:sys.stdout.flush()
)。私のテストでは、Pythonは、プログラムが終了するまでprint
でも自動的にこれを行いません。
Pythonを-u
フラグとともに実行して、出力のバッファリングを回避できます。
Nohup python -u ./cmd.py > cmd.log &
'-'と 'Nohup'を使用する私のために働いた。すべてが「Nohup.out」ファイルに保存されます。このような-
Nohup python -u code.py &
export PYTHONUNBUFFERED=1
Nohup ./cmd.py > cmd.log &
または
Nohup python -u ./cmd.py > cmd.log &
同様の問題がありましたが、Pythonプロセスとは関係ありませんでした。私はNohupを実行するスクリプトを実行しており、スクリプトはcronを介して定期的に実行されていました。
次の方法で問題を解決できました。
PS:私のスクリプトはRHELで実行されるkshで書かれました
Python 3.3以降には、printのflush引数があり、これが私にとって有効な唯一の方法です。
print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)