OCI や AWS EC2 で作業していると、SSH セッションを閉じたタイミングで実行中のプログラムが止まってしまうことがあります。
この問題は、tmux の「セッションを切り離す(detach)」を使うだけでほぼ解決できます。
私は今回初めて tmux を使ったため、必要な操作に限定してメモしておきます。
先にまとめ
「SSH を閉じても処理を動かし続ける」目的なら、tmux は以下だけで運用できます。
- SSH ログイン後に tmux セッションを作る
- tmux 内でプログラムを起動する
Ctrl+b→dで切り離す- SSH を切断しても処理は継続する
- 再ログイン後に 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+bd
これで tmux の外に戻ります。
プログラムは tmux セッション内でそのまま動き続けますので、SSH 自体を切断して問題ありません。
再ログイン後に tmux へ戻れます。
4. 再接続する(attach)
tmux ls でセッション一覧を見て、名前を確認します。
tmux ls
以下のコマンドで再接続します。
tmux attach -t app
セッションを終了して抜ける(プロセスを停止してセッションを閉じる)
tmux をデタッチせずにそのままセッションを終了して抜けたい場合は、主に次の方法があります。
セッション内から終了する(推奨 — プロセスを安全に停止)
tmux attach -t <セッション名>でセッションに戻る- 実行中のプロセスを
Ctrl+Cなどで停止する - シェルで
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+b → d | セッション切り離し |
Ctrl+b → c | 新しいウィンドウ作成 |
Ctrl+b → n | 次のウィンドウへ移動 |
Ctrl+b → p | 前のウィンドウへ移動 |
Ctrl+b → , | ウィンドウ名を変更 |
最初は Ctrl+b → d だけ覚えれば十分です。
よくあるハマりどころ
SSH を切ったら止まった
tmux の中で起動せず、通常シェルで起動している可能性があります。tmux attach -t app で戻って、そこで起動し直してください。
tmux attach で「no sessions」になる
セッションが存在しない状態です。新しく作成します。
tmux new -s app
セッション名を忘れる
tmux ls
一覧を出して、その名前で attach すれば戻れます。