web-dev-qa-db-ja.com

Nohupは出力ファイルにログを書き込みません

次のコマンドを使用して、バックグラウンドでpythonスクリプトを実行しています。

Nohup ./cmd.py > cmd.log &

しかし、Nohupはログファイルに何も書き込んでいないようです。 cmd.logは作成されますが、常に空です。 pythonスクリプトでは、printの代わりにsys.stdout.writeを使用して標準出力に出力しています。私は何か間違っていますか?

114
user1642513

Stdoutを定期的にフラッシュする必要があるようです(例:sys.stdout.flush())。私のテストでは、Pythonは、プログラムが終了するまでprintでも自動的にこれを行いません。

87
wulong

Pythonを-uフラグとともに実行して、出力のバッファリングを回避できます。

Nohup python -u ./cmd.py > cmd.log &
318
vz0

'-' 'Nohup'を使用する私のために働いた。すべてが「Nohup.out」ファイルに保存されます。このような-

Nohup python -u code.py &
26
export PYTHONUNBUFFERED=1
Nohup ./cmd.py > cmd.log &

または

Nohup python -u ./cmd.py > cmd.log &

https://docs.python.org/2/using/cmdline.html#cmdoption-

10
Ryu_hayabusa

同様の問題がありましたが、Pythonプロセスとは関係ありませんでした。私はNohupを実行するスクリプトを実行しており、スクリプトはcronを介して定期的に実行されていました。

次の方法で問題を解決できました。

  1. stdin、stdoutおよびstderrのリダイレクト
  2. nohupを介して呼び出されるスクリプトがバックグラウンドで他の何も実行しないようにする

PS:私のスクリプトはRHELで実行されるkshで書かれました

0
Pradeep Anchan

Python 3.3以降には、printのflush引数があり、これが私にとって有効な唯一の方法です。

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
0
Ganesh Krishnan