仮想端末screenでセッションがきれてもそのまま作業を継続する

screenとは

主にLinuxやMacのターミナルにおいて仮想端末を起動させることができるツールである。

サーバにログイン後に、さらにそこから仮想的な端末にログインできる。

流れとしてはこうなる。

  1. WindowsからLinuxにログイン
  2. Linuxから、そのLinux上の仮想端末にログイン

screenのメリット

Linux インストール方法

redhat系の場合

# yum install screen

まずはscreenを起動してみる

私は最初勘違いしていた。

screenはクライアントに入れるものではない。

サーバ(ターミナルの接続先)にインストールするものです。

ローカルの仮想Linux環境(vagrant)で試してみる、

ログインすると、接続先がクライアントアプリのタイトルバーに表示される。

最初は

vagrant@localhost

と表示される。

ここで

screen

コマンドを実行すると、画面が切り替わって

screen 0

という接続先に接続される。これで仮想端末にログインしたことになる。

これは

exit

で抜けられる。すると元の仮想でない端末に戻る。

仮想端末を維持したまま元の画面へ戻るには

まずは仮想端末への行き来をわかりやすくするために仮想端末ログイン時に名前をつける。

screen -S test-term

test-termというのは何でもよい。通常は使用目的によってわかりやすい名前をつける。

Ctrl + aをおしてdを押す

すると

[detached from test-term1

と表示され、元の画面に戻る。

ここで

$ screen -ls
There are screens on:
        xxx.test-term    (Detached)
1 Sockets in /var/run/screen/xxx.

で、現在実行中の仮想端末の一覧を表示できる。

ここで再度接続するには、先ほどの名前を指定して-rでアクセスする。

screen -r test-term

すると先ほど中断したところから作業を再開できる。

ちなみにctrl + adで抜けずに、 画面を閉じたり、ネットワークが切れてセッションが途切れたときも仮想端末は起動したままになっているので、試してみると良いだろう。

エスケープと.screenrc

仮想端末から戻るにはデフォルトだとctrl + adである。

このctrl + aをscreenではエスケープといい、仮想端末上でこれを押すと特別なモードになって各種screen用のコマンドを実行することができる。

しかしこのctrl+aがemacsの先頭へ戻るキーバインドと重なり不便である。

その場合はエスケープ用のキーを変更する。

homeディレクトリに、.screenrc ファイルを作成する。

そこでエスケープ用のキーを指定することができる。

私はいくつかのサイトをみてctrl + tをエスケープとすることにした。その場合は下記のように記述する。

escape ^Tt

コマンド一覧

セッション外

機能 コマンド 備考
セッションの一覧を表示する screen -ls  
新たなセッションに接続(アタッチ)する screen 名前指定なし
新たなセッションに名前を指定して接続(アタッチ)する screen -S セッション名  
既に存在するセッションに再接続(アタッチ)する screen -r セッション名 セッション名の代わりにpidでもOK
セッションを切断(デタッチ)する screen -d セッション名 端末Aからのアタッチを端末Bからデタッチできる

セッション内

機能 コマンド 備考
セッションから切断する (エスケープ) d (エスケープ)のデフォルトはCtrl + a
セッション内で新しいウィンドウを作る (エスケープ) c  
セッション内でアクティブなウィンドウを削除 (エスケープ) k  
セッション内でウィンドウを順番に切替 (エスケープ) space  
セッション内で指定したウィンドウへ切替 (エスケープ) ウィンドウ番号 ウィンドウ番号は通常0,1,2…と順に割り当てられる
セッション内でウィンドウの一覧を表示 (エスケープ) w 私の環境だとターミナルアプリのタイトルバーに番号が表示されます

画面分割

機能 コマンド 備考
画面を上下(水平方向)に分割 (エスケープ) S (エスケープ)のデフォルトはCtrl + a
画面を左右(垂直方向)に分割 (エスケープ) | エルじゃなくてパイプ
分割した画面間を移動 (エスケープ) TAB  
分割した画面を削除 (エスケープ) X