[Python] nohup ~ & が終了時にしかprint()がファイルに出力されない

[Python] nohup ~ & が終了時にしかprint()がファイルに出力されない

Pythonだと nohup コマンドの出力が終了時にしか出力されない

Python で次のようなコードがあるとします。30秒間カウントし続け、それを出力します。

import time

for i in range(0, 30):
    print(i)
    time.sleep(1)

これをバックエンドで実行するために以下のようなコマンドで実行します。

$ nohup python x.py &

実行すると nohup.out が生成され、そこに出力結果が保存されますが、すべての処理が終了してから一気に 0~29 までが書き込まれます。これを都度書き込まれるようにするには適宜明示的にフラッシュしてやる必要があります。

import time
import sys

for i in range(0, 30):
    print(i)
    sys.stdout.flush() # 明示的にflush
    # print(i, flush=True) でもよい
    time.sleep(1)

どうも Python だと明示的にフラッシュしないと、プログラムが終了するまで書き込みがされないようです。sys.stdout.flush() を実行するとバッファリングされたデータをを標準出力に書き出してくれます。もしくは print(i, flush=True) といった具合に引数でフラッシュすることを指示することができます。

nohup python x.py & で再度動作を確認してみると、実行中でも都度 nohup.out に書き込まれていることが確認できます。

Ruby の場合

調べていると Ruby でも同じようにバッファリングされるだけでプログラム終了時までフラッシュされない場合があるようなので、同様に明示的にフラッシュしてやれば適宜書き出されます。

以上。

Linuxカテゴリの最新記事