GNU screenを覚える

いい加減ターミナルを閉じたいのでscreenを使うことにする。screenを使えば自由にリモートからの端末をつけたり外したりできる。

screenの構造概念

  • セッション: screenの接続単位の仮想端末
  • ディスプレイ: セッションと接続する端末
  • ウィンドウ: セッション中の起動シェル

ディスプレイはセッションに対し、接続・切断する。セッション中には複数のウィンドウを作成でき、同時実行させ、ディスプレイに出すウィンドウを切り替えることができる。

セッションを新たに作る

$ screen

Enterを押せばログインシェルが立ち上がり普通のターミナルとして使える。

リモートアクセスで作業している場合、この上でコマンドを実行させていれば、たとえ不意に通信が途切れても処理は続き、もう一度接続しログインして

$ screen -r

と打つだけで途切れてしまった端末が復活できる。

コマンド

screen独自の機能はコマンドを送ることで操作できる。コマンドはすべてctrl+aに続いて行われる。それ以外は下のコマンドに渡される。

ただしbashemacsでのctrl+aで先頭に戻る場合、かわりに、

  • ctrl+a a

を入れることになる。

また、.screenrcにて

escape ^m^m

と書けば、ctrl+aのかわりにctrl+mになる。

ウィンドウを新たに作る
  • ctrl+a c
ウィンドウ一覧を出す
  • ctrl+a w

現在のウィンドウには*がつく

ウィンドウを切り替える
  • ctrl+a n : 次のウィンドウ
  • ctrl+a p : 前のウィンドウ
  • ctrl+a ctrl+a : 直前のウィンドウ
  • ctrl+a " : ウィンドウリストから選択
デタッチ
  • ctrl+a d

セッションは残したまま、screenが終了する。

たとえばサーバプログラムをユーザー権限のまま実行する場合、screen上でサーバプログラムを動かしておき、そこでデタッチして端末を閉じればよい。

login$ screen
screen$ cd rails/test
screen$ ./script/server
...
ctrl+a d
login$ logout

レジューム

$ screen -r

デタッチされているセッションから選ぶ。Attachのものは選べない。

ディスプレイ切り替え

リモートでセッションをデタッチさせてからレジュームする

$ screen -d -r 

マルチディスプレイ

$ screen -x

こちらはアタッチ済みのものから選ぶ。配下のプロセス(シェルレベル以下)は共有するが、screen機能は共有しないので別々のウィンドウを表示させられる。

シェルプロセスは共有するので、片側でシェルを終わらせてしまうと、当然もう片方でもそのシェルは終了してるので注意。

セッションリストの一覧

$ screen -ls
There is a screen on:
       6236.pts-3.colinux     (Attached)
1 Socket in /var/run/screen/...

と出る。6236.pts-3.colinuxはPID.tty.hostらしい。

これは複数のscreenセッションがある場合、

$ screen -r pts-3
$ screen -d -r pts-3
$ screen -x pts-3

のようにセッションを指定するときに使う。

コピーペースト

screenレベルでのコピペが可能

  • ctrl+a [ : コピーモード開始
    • カーソルキー : カーソル移動
    • c : 矩形選択左側設定
    • shift+c : 矩形選択右側設定
    • ENTER : コピースタート設定
    • ENTER : コピーエンド設定&コピー&コピーモード終了
  • ctrl+a ] : ペースト