GNU screenを覚える
いい加減ターミナルを閉じたいのでscreenを使うことにする。screenを使えば自由にリモートからの端末をつけたり外したりできる。
screenの構造概念
- セッション: screenの接続単位の仮想端末
- ディスプレイ: セッションと接続する端末
- ウィンドウ: セッション中の起動シェル
ディスプレイはセッションに対し、接続・切断する。セッション中には複数のウィンドウを作成でき、同時実行させ、ディスプレイに出すウィンドウを切り替えることができる。
セッションを新たに作る
$ screen
Enterを押せばログインシェルが立ち上がり普通のターミナルとして使える。
リモートアクセスで作業している場合、この上でコマンドを実行させていれば、たとえ不意に通信が途切れても処理は続き、もう一度接続しログインして
$ screen -r
と打つだけで途切れてしまった端末が復活できる。
コマンド
screen独自の機能はコマンドを送ることで操作できる。コマンドはすべてctrl+aに続いて行われる。それ以外は下のコマンドに渡される。
ただしbashやemacsでの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 ] : ペースト