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
でも同じようにバッファリングされるだけでプログラム終了時までフラッシュされない場合があるようなので、同様に明示的にフラッシュしてやれば適宜書き出されます。
以上。
コメントを書く