NeeNetです。
PythonのWebアプリケーションフレームワークであるFlaskは非常に使い勝手の良いフレームワークなので、皆さんも利用することが多いかと思います。
「世界に公開したい!」と思った際は今だとAWSのEC2などクラウドを利用するのが一般的です。
今回はEC2などのサーバーにSSHでアクセスしFlaskアプリを起動した後、セッション終了後も起動し続ける方法をご紹介します。
方法1
まず最も簡単なのは nohup を利用することです。
nohup
とはUNIXやLinuxのコマンドラインでよく使われるコマンドの一つです。
プログラムをバックグラウンドで実行し、シェルを閉じてもそのプロセスが終了しないようにしてくれます。(”no hang up”を意味する)
すなわち、これを使うとSSH接続をしたターミナルを終了してもバックグラウンドでFlaskアプリケーションを起動し続けてくれるということです。
app.py
というFlaskのアプリケーションに対し、具体的には以下のコマンドで実行可能です。
$ nohup python app.py &
最後の&
はそのコマンドをバックグラウンドで実行するためのものです。
nohup
コマンドが実行されると、コマンドの標準出力(STDOUT)と標準エラー出力(STDERR) は、ユーザーが指定しなければnohup.out
というファイルにリダイレクト(書き込み)されます。
仮にprintデバッグをしていた場合は、上記のファイルにリダイレクトされる形になります。
nohup.outにプログラム実行中も出力を行いたい場合
先程出力はnohup.outにリダイレクトされると記載をしましたが、デフォルトだとプログラム終了時にしか出力されません。
したがって、プログラム実行中はファイルの中身を確認しても何も出力されていないという状態になります。
プログラム実行中でも書き込みを確認したい場合は、Pythonアプリケーション内で以下のように明示的にフラッシュすることで確認できるようになります。
import sys
print("test")
sys.stdout.flush() # 明示的にflush
print("test", flush=True) # このようにprint文の引数で指定しても良い
方法2
より高度にセッションを管理したい場合、 tmux を利用することもできます。
インストール方法はお使いのOSにもよりますが、例えばubuntuでは以下でインストール可能です。
$ sudo apt install tmux
tmux
を利用する場合は、以下のようにセッションを作成し、プログラムを起動します。
# 任意のセッション名をつけて、コマンドを指定
$ tmux new-session -d -s my_flask_app 'python app.py'
起動しているセッションの一覧の確認や再接続・終了については、それぞれ以下のコマンドで実行できます。
# セッションの一覧確認
tmux ls
# セッションに再接続
$ tmux attach -t my_flask_app
# セッションを終了
$ tmux kill-session -t my_flask_app
起動したいFlaskアプリケーションが複数ある場合などはtmuxを使う方が便利です。
最後に
今回はサーバーにSSHでアクセスした後、セッション終了後もFlaskアプリケーションを起動し続ける2つの方法nohup
とtmux
をご紹介しました。
これらは何れもプロセスを親のシェルセッションから切り離してバックグラウンドで実行することを目的としている点では同じですが、その特性や使い方は異なるので、用途によって上手く使い分けて頂ければと思います。
参考になりましたら幸いです。