Linux / コマンド / screen - ターミナルセッションの維持と管理
screenは、ひとつの実際のターミナル内に複数の仮想ターミナルを作成し、セッションを分離(detach)した後に再び接続(reattach)できるターミナルマルチプレクサです。SSH接続が切断されてもインタラクティブな作業環境を維持する必要があるときに便利で、基本的な流れはセッション作成 → 作業実行 → Ctrl+A 次に d で分離 → screen -r で再接続です。
単に非インタラクティブなコマンドをバックグラウンドで実行する目的であれば、nohupの方が簡単かもしれません。逆に、実行画面を再び開いて入力する必要がある場合はscreenやtmuxが適しています。
screenはどのような状況で使用しますか?
GNU Screenは、一つのターミナルを複数のプロセスが使用する仮想ターミナルに多重化します。各ウィンドウのプログラムは画面に表示されていなくても、あるいは全セッションが分離されている間でも実行を続けます。詳しい動作や全コマンドはGNU Screen公式マニュアルで確認できます。
- SSHで接続したサーバーでコンパイル、データ処理、バックアップのような時間のかかる作業を実行するとき
- 作業画面を分離した後、別のコンピュータから再接続する必要があるとき
- 一つのSSH接続内でシェル、ログ監視、エディタなど複数のターミナルウィンドウを操作する時
- 実行中の対話型プログラムの画面を後でそのまま確認する必要がある時
screen セッションはサーバーの再起動に耐えられず、プログラムの障害を検知して自動で再起動もしません。常時サービスには systemd のようなサービスマネージャを使用してください。
インストールして最初のセッションを開始する
screen をインストールする
ディストリビューションに対応する例だけを選んでインストールします。管理者権限が必要です。パッケージが見つからない場合は、そのディストリビューションの公式パッケージ情報と有効なリポジトリを確認してください。
sudo apt update
sudo apt install screen
sudo dnf install screen
sudo pacman -S screen
インストールの有無とバージョンは次のように確認します。
screen --version
名前を付けてセッションを作成する
-S オプションでセッション名を設定すると、複数の作業を区別しやすくなります。名前には作業目的が分かる短い文字列を使用してください。
screen -S backup
新しいシェル画面が開いたら、その中で普段通りコマンドを実行します。現在のシェルが Screen 内にあるかどうかは環境変数で確認できます。
printf '%s\n' "$STY"
コマンドとともにセッションを開始する
セッションを作成しながら実行するプログラムをすぐに指定することもできます。
screen -S backup ./backup.sh
./backup.sh は自分で準備し、実行権限と動作を確認したスクリプトの例です。Screen はバックアップ処理そのものを作成しません。まず影響のないテスト作業で切り離しと再接続を確認してください。
指定したプログラムが終了し、セッション内に他のウィンドウがない場合、Screen セッションも終了することがあります。作業終了後に結果を画面で確認する必要がある場合は、まずシェルセッションを作成し、その中でコマンドを実行する方法がより便利です。
よく使う Screen ショートカット
Screen コマンドは基本的に Ctrl+A を押した後に次のキーを押す2段階方式です。小文字と大文字は区別されます。表の小文字は Shift を押さずに入力し、ウィンドウ名変更の大文字 A とログ切り替えの大文字 H は Shift とともに入力します。以下の Ctrl+A, d は二つのキーを同時に押すのではなく、Ctrl+A を離した後に d を押すという意味です。
| ショートカット | 機能 | 説明 |
|---|---|---|
Ctrl+A, d |
セッション分離 | プログラムを維持したまま現在のターミナルから抜けます。 |
Ctrl+A, c |
新しいウィンドウの作成 | 現在のセッション内に新しいシェルウィンドウを作ります。 |
Ctrl+A, n |
次のウィンドウ | 次の仮想ターミナルウィンドウに移動します。 |
Ctrl+A, p |
前のウィンドウ | 前の仮想ターミナルウィンドウに移動します。 |
Ctrl+A, " |
ウィンドウ一覧 | 一覧から移動するウィンドウを選択します。 |
Ctrl+A, A |
ウィンドウ名の変更 | 現在のウィンドウにわかりやすいタイトルを付けます。 |
Ctrl+A, [ |
コピー・スクロールモード | 以前の出力を参照したり、テキストをコピーします。 |
Ctrl+A, H |
ログ記録の切り替え | 現在のウィンドウの出力をログファイルに記録するか停止します。 |
Ctrl+A, k |
現在ウィンドウを閉じる | 確認後、現在の仮想ウィンドウを削除します。 |
Ctrl+A, ? |
ヘルプ | 現在のキー割り当てリストを表示します。 |
プログラム自体にCtrl+Aを送る必要がある場合は、Ctrl+A 次に小文字の a を使用します。ショートカットキーは.screenrc設定によって異なる場合があります。
セッションを分離して再接続する
作業を保持したまま分離する
Screenセッション内でCtrl+A 次に d を押すとセッションが分離されます。分離後はSSH接続を終了しても、通常はセッション内のプログラムが引き続き実行されます。ただし、ログアウト時にユーザーの全プロセスを終了するシステムポリシーがある場合は、Screen も終了することがあります。
ターミナル接続が予期せず切断された場合でも、基本autodetach設定が有効であれば、セッションは自動的に分離されます。
セッション一覧を確認する
screen -ls
出力にはセッション識別子とDetached、Attachedのような状態が表示されます。複数のセッションがある場合は、名前や完全な識別子を指定して接続する必要があります。
分離されたセッションに再接続する
screen -r backup
セッションが他のターミナルに接続されている場合は、まず一覧を確認してください。以前の接続を分離し、現在のターミナルに接続する意図が確実なとき、次の形式を使用します。
screen -d -r backup
-d -rは他の利用者の正常な作業画面を中断させる可能性があるため、共有アカウントや共同運営環境では注意が必要です。
1つのセッションで複数のウィンドウを使用する
ウィンドウを作成し、名前を付ける
Ctrl+A, cで新しいウィンドウを作成した後、Ctrl+A, Aでウィンドウ名を付けることができます。例えば、最初のウィンドウは作業実行、2番目のウィンドウはログ確認、3番目のウィンドウはシステム状態確認に使用できます。
ウィンドウ間の移動
Ctrl+A, nとCtrl+A, pで次のウィンドウ・前のウィンドウに移動します。ウィンドウが多い場合は、Ctrl+A, "でリストを開き、目的のウィンドウを選択する方が早いです。
ウィンドウとセッションを正しく終了する
現在のシェルでexitを実行すると、そのウィンドウが終了します。最後のウィンドウまで終了すると、Screenセッションも終了します。
exit
セッションを単に分離したい場合は、exitではなくCtrl+A, dを使用する必要があります。実行中のプログラムがあるウィンドウを強制的に閉じると作業結果が損なわれる可能性があります。
スクロールとログ記録の活用
以前の出力の探索
Ctrl+A, [を押すとコピー・スクロールモードに入ります。方向キー、Page Up、Page Downで以前の出力を確認し、Escで抜け出すことができます。保持される行数は設定と-hオプションの影響を受けます。
screen -h 10000 -S analysis
ウィンドウ出力をファイルに記録する
Ctrl+A, Hを押すと、現在のウィンドウの出力ログ記録をオンまたはオフにします。基本のログファイル名は通常screenlog.0で、新しいセッションを開始すると自動的に記録をオンにすることもできます。
screen -L -Logfile backup-screen.log -S backup
ログには画面に出力されたパスワード、トークン、個人情報が含まれる場合があります。保存場所とファイル権限を確認し、長時間作業ではログが無制限に大きくならないよう、別途保存方針を設けてください。
問題状況とセキュリティ注意事項
セッションがAttached状態のままの場合
ネットワークが切断された直後、セッションがAttachedのまま残ることがあります。まず、他のターミナルで実際に使用中かどうか確認した後、screen -d -r セッション名で以前の表示を分離し、現在のターミナルに接続します。
Dead またはアクセスできないセッション項目は、実行中のプロセスがないことを十分に確認した後、screen -wipe で整理することができます。
同じアカウントのセッションアクセス権
Screen セッションは OS ユーザーアカウントの権限に従います。同じアカウントを複数人で共有すると、他の人がセッションに再接続できるため、アカウントの共有を避け、SSH キーとアカウント権限を分離してください。セッション内に管理者シェルや機密画面を開いたまま席を離さないことも重要です。
screen、nohup、tmux、systemd の比較
| ツール | 適した作業 | 重要な特徴 |
|---|---|---|
screen |
再接続可能な対話型ターミナル作業 | セッションの分離・再接続およびマルチウィンドウをサポートします。 |
tmux |
対話型作業と複雑な画面分割 | ウィンドウとパネルの管理、ユーザー設定機能が豊富です。 |
nohup |
簡単な非対話型バッチ作業 | SIGHUPは無視しますが、ターミナル画面は復元しません。 |
systemd |
常時実行する必要のあるサービス | ブート連動、失敗時の再起動、依存関係とログ管理を設定できます。 |
非対話型作業をターミナル終了後も実行する方法はnohupコマンドの使い方で確認できます。
よくある質問
SSH接続が切れても作業は続行されますか?
Screenの自動分離が正常に動作していて、サーバーが引き続き実行中であれば、セッション内のプログラムも維持されます。ただし、サーバーの再起動、プロセス自体のエラー、管理者による終了まで防ぐことはできません。
screen -rでセッションが複数あると表示された場合はどうすればよいですか?
screen -lsで一覧を確認した後、screen -r backupのようにセッション名または全体識別子を指定してください。意味のある名前を付けて作成すると、選択ミスを減らすことができます。
Ctrl+Aがプログラムのショートカットと衝突する場合はどうすればよいですか?
Ctrl+Aの後に小文字のaを押すと、プログラムに文字Ctrl+Aを送ることができます。Screenのコマンドキー自体を変更するには-eオプションや.screenrcの設定を使用できますが、チームで共有するドキュメントやショートカットも合わせて調整する必要があります。
再起動後もScreenセッションを復元できますか?
いいえ。Screenは実行中のシステムのプロセスと仮想端末を維持するだけで、再起動後にセッションとプロセスを自動で復元することはありません。再起動後に自動起動が必要な場合は、サービスをsystemdで構成するか、作業の特性に合ったスケジューラーを使用してください。
まとめ
screen -S 名前でセッションを作成し、Ctrl+A, dで切り離した後、screen -r 名前で再接続するのが基本的な使い方です。複数のウィンドウやログ機能を活用すれば、不安定なリモート接続でも対話型作業を体系的に続けることができます。
ただし、Screenはサービス監視ツールではありません。再起動連携や自動復旧が必要なプログラムはサービスマネージャーで運用し、Screenは人が再接続して操作するターミナル作業に使用してください。




