仮想端末screenでセッションがきれてもそのまま作業を継続する
25 May 2017screenとは
主にLinuxやMacのターミナルにおいて仮想端末を起動させることができるツールである。
サーバにログイン後に、さらにそこから仮想的な端末にログインできる。
流れとしてはこうなる。
- WindowsからLinuxにログイン
- 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 + a⇒dで抜けずに、
画面を閉じたり、ネットワークが切れてセッションが途切れたときも仮想端末は起動したままになっているので、試してみると良いだろう。
エスケープと.screenrc
仮想端末から戻るにはデフォルトだとctrl + a⇒dである。
この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 |