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


141

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

nohup ./cmd.py > cmd.log &

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


のどのバリアントnohupを使用していますか?BSDバージョンはnohup.out、現在のディレクトリで呼び出されたファイルに書き込みます(または$HOME/nohup.out現在のディレクトリが書き込み可能でない場合)。出力ファイル名を変更する方法がわかりません...
wulong

@wulongこれは、stdoutがターミナルの場合のみです。
John Kugelman、

また、リダイレクトせずにコマンドを試したところ、nohup.outファイルがまったく作成されませんでした。どのバリアントかはわかりませんが、SunOS 5.10を使用している場合は問題ありません。

回答:


103

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


17
Pythonや他のC stdioベースのプログラムは、インタラクティブな場合(stdoutがttyに接続されている場合)にラインバッファリングを使用し、ファイルにリダイレクトされるときにブロックバッファリングを使用します。python -uうまくいかない場合; nohup独自のバッファリングを導入している可能性があります。
jfs 2012年

12
@JFSebastian現在のところ、nohup出力をバッファリングせず、正常にpython -u動作します。(人々のための単なる更新)
Pijusn 2014年

1
@Pius:nohupPOSIXユーティリティでありプラットフォームによって実装が異なる可能があります。ところで、python3 I / OはもはやC stdioベースではありませんが、同様のバッファリング動作を持っています。
jfs 2014

381

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

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

12
これの方が良い!
どうも

@kommradHomerプログラムが生成するstdout / stderrの出力の量に依存すると思います。
vz0

1
魅力のように機能します。また、正解として選んだものよりも良い答えだと思います。他のユーザーを混乱させないように、これに正しいマークを付けてください。
Ondrej Burkert

1
警告:常に機能するとは限りません。理由はわかりません。あなたは?
Basj

3
これは受け入れられる答えになるはずです...私がやりたいことをしました。ありがとう!
クリンカー2017

42
  • で使用する-unohupうまくいきました。を使用-uするとstdoutstderrストリームが強制的にバッファリングされなくなります。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ジョブなどのツールを使用して、バックグラウンドで実行し、実行をスケジュールすることをお勧めします。


@ vz0からの回答の違いは何ですか?
Deqing

1
@Deqingには違いはありません。
2018年


2

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

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

0

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

私は問題を解決することができました:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.