OCI や AWS EC2 でセッション切断後も処理を止めないよう tmux を使う

SSH 切断で処理が止まる問題を、tmux の最小操作だけで解決する手順をまとめます。

OCI や AWS EC2 で作業していると、SSH セッションを閉じたタイミングで実行中のプログラムが止まってしまうことがあります。

この問題は、tmux の「セッションを切り離す(detach)」を使うだけでほぼ解決できます。
私は今回初めて tmux を使ったため、必要な操作に限定してメモしておきます。

先にまとめ

「SSH を閉じても処理を動かし続ける」目的なら、tmux は以下だけで運用できます。

  1. SSH ログイン後に tmux セッションを作る
  2. tmux 内でプログラムを起動する
  3. Ctrl+bd で切り離す
  4. SSH を切断しても処理は継続する
  5. 再ログイン後に tmux へ再接続する

コマンドだけ見ると以下です。

# セッション作成
tmux new -s app

# (tmux 内で)プログラム実行
python main.py

# 切り離し: Ctrl+b, d

# いまあるセッション確認
tmux ls

# 再接続
tmux attach -t app

tmux のインストール

Ubuntu 系なら以下で入ります。

sudo apt update
sudo apt install -y tmux

確認(バージョン表示)

tmux -V

まずは 1 回動かしてみる

1. セッションを作る

tmux new -s app

app はセッション名です。
あとで再接続するときに使うので、用途が分かる名前を付けると楽です。

📝 注記

tmux だけ打った場合、もし tmux サーバーがまだ動いていなければ、新しいセッションを作って接続します(デフォルト名で作成)。
すでに tmux が動いていて接続済みでない場合は、最近使われたセッションにアタッチします(新しいセッションは作成されません)。 上記のコマンドは明示的に新規の名前付きセッションを作るコマンドになります。

2. プログラムを起動する

tmux の画面の中で、普段どおりコマンドを実行します。

python main.py

たとえば API サーバーなら、以下のように常駐するコマンドでも同じです。

uvicorn app:app --host 0.0.0.0 --port 8000

3. セッションを切り離す(detach)

以下の順でキーを押します。

  • Ctrl+b
  • d

これで tmux の外に戻ります。
プログラムは tmux セッション内でそのまま動き続けますので、SSH 自体を切断して問題ありません。
再ログイン後に tmux へ戻れます。

4. 再接続する(attach)

tmux ls でセッション一覧を見て、名前を確認します。

tmux ls

以下のコマンドで再接続します。

tmux attach -t app

セッションを終了して抜ける(プロセスを停止してセッションを閉じる)

tmux をデタッチせずにそのままセッションを終了して抜けたい場合は、主に次の方法があります。

セッション内から終了する(推奨 — プロセスを安全に停止)

  1. tmux attach -t <セッション名> でセッションに戻る
  2. 実行中のプロセスを Ctrl+C などで停止する
  3. シェルで exit または Ctrl+D を押すとウィンドウが閉じ、最後のウィンドウが閉じるとセッションは終了します

外からセッションを強制的に終了する(注意: プロセスが強制終了される)

  • tmux kill-session -t <セッション名>
  • 全てのセッションを終了する場合は tmux kill-server

注意: セッションを閉じると、そのセッション内で動いていたプロセスは終了します。処理を継続させたい場合はデタッチしてください。

今回の用途で最低限覚えるコマンド

用途コマンド
新規セッション作成tmux new -s app
セッション一覧tmux ls
セッション再接続tmux attach -t app
セッション削除(停止)tmux kill-session -t app
💡 ヒント

セッション内で動いているプロセスを止めたいときは、まず tmux に再接続して Ctrl+c で停止するのが安全です。

キー操作の最小セット

tmux は Ctrl+b を押したあとに次のキーを押す操作が基本です(prefix キー)。

コマンド内容
Ctrl+bdセッション切り離し
Ctrl+bc新しいウィンドウ作成
Ctrl+bn次のウィンドウへ移動
Ctrl+bp前のウィンドウへ移動
Ctrl+b,ウィンドウ名を変更

最初は Ctrl+bd だけ覚えれば十分です。

よくあるハマりどころ

SSH を切ったら止まった

tmux の中で起動せず、通常シェルで起動している可能性があります。
tmux attach -t app で戻って、そこで起動し直してください。

tmux attach で「no sessions」になる

セッションが存在しない状態です。新しく作成します。

tmux new -s app

セッション名を忘れる

tmux ls

一覧を出して、その名前で attach すれば戻れます。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。