Python nohupのログが出ない

nohupコマンドを実行すると、デフォルトではnohup.outにログとして出力されます。

しかし、適時ログとして出力してくれないという問題が発生したため、その解決策を紹介します。

nohupってなんじゃそりゃという方はこちら

Pythonのプログラムをnohupコマンドで実行すると、nohup.outになにも書かれないという現象が発生しました。

これでは、プログラムがどのあたりまで進んだのか分かりません。

topコマンドやpsコマンドで確認すると、どうやらご機嫌よくプログラムは動いているようです。

原因

nohupコマンドを用いたPythonのプログラムは、全ての作業を終了してから一気に書き込まれるようです。

標準出力するような作業は、重い処理であるため、命令(print関数)が来てすぐに実行するのではなく、タイミングを見て出力するようです。このことをバッファリングといいます。

nohupコマンドを用いてスクリプト言語を処理するとこのような症状が出るようです。

ですので、バッファリングを無効にする必要があります。

方法

Pythonのコードを以下のように変更しましょう。

print("出力したい内容")
sys.stdout.flush() #追加

また、Python3だと以下のように変更できます。

print("出力したい内容",flush=True)

こうすることで適時ログとして出力してくれます。

また、Pythonのオプションでuとすることで、上記のようにPythonプログラムをいじらなくても済みます。

$ nohup python -u sample.py &

このようにバッファリングしている結果を強制的に吐かせる方法をflushと言います。

まとめ

nohupコマンドでスクリプト言語を実行すると、バッファリングして適時ログとして出力してくれません。

flushすることで解決します。

本記事では、Pythonでflushする方法を紹介しました。