やりたかったこと

VPSで長時間かかる処理を走らせたまま、ターミナルを閉じたかった。 SSH接続が切れるとプロセスも死ぬので、screenを使ってセッションを永続化することにした。

screenのインストール

# Ubuntu/Debian
sudo apt install screen

# CentOS/RHEL
sudo yum install screen

インストール済みかどうかは screen --version で確認できる。

基本的な使い方

新しいセッションを作成する

screen

そのままセッションが始まる。名前をつけておくと後で分かりやすい。

screen -S mysession

セッションをデタッチする(バックグラウンドに回す)

Ctrl + A を押してから D を押す。

[detached from 12345.mysession]

このメッセージが出たらデタッチ成功。SSH接続を切断しても、セッション内のプロセスは動き続ける。

既存セッションに再接続する

# セッション一覧を確認
screen -ls
There is a screen on:
        12345.mysession (Detached)
1 Socket in /run/screen/S-user.
# セッション名を指定して再接続
screen -r mysession

# IDを指定する場合
screen -r 12345

セッションを終了する

セッション内で exit を実行するか、Ctrl + D で終了できる。

よく使うキーバインド

操作キー
デタッチCtrl + AD
新しいウィンドウを作成Ctrl + AC
ウィンドウ一覧を表示Ctrl + A"
次のウィンドウへ移動Ctrl + AN
前のウィンドウへ移動Ctrl + AP
セッションを強制終了Ctrl + AK

複数セッションの管理

# セッション一覧
screen -ls

# 特定のセッションを強制終了(セッション内に入れない時)
screen -S mysession -X quit

デタッチ済みセッションへの再接続時にエラーが出る場合は -d -r を使う。

# 接続中の別クライアントを切り離して再接続
screen -d -r mysession

ハマったポイント

  • screen -r でセッションが見つからない時はセッション名ではなくIDで指定すると解決することがある
  • SSH接続が切れた後に再接続すると (Attached) 状態になっている場合がある。その場合は screen -d -r を使う
  • 複数ユーザーが同じVPSを使う場合、screen -ls には自分のセッションしか見えない
  • screenセッション内でさらにscreenを起動するとキーバインドが衝突するので注意
  • 長期運用なら screen より tmux のほうが機能が豊富なことも覚えておく

関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。