GNU screen メモ

このページ内では、以下の凡例に沿って記述する。

 C-a           Control キーを押しながら a
 C-a C-a       Control キーを押しながら a を押した後、Control キーを押しながら a
               (間にある空白は「見た目の区切り」で、打鍵ではない)
 C-a SPACE     Control キーを押しながら a を押した後、スペース
 C-a a         Control キーを押しながら a を押した後、a
 C-a A         Control キーを押しながら a を押した後、A

 :focus up     C-a : でプロンプトになるので、そこに focusスペースupエンター
               (コロン行のほうは、空白は打鍵を意味する)

 %             一般ユーザのシェルのプロンプト。
 #             特権ユーザのシェルのプロンプト。

若干ややこしい書き方かもしれないが、 これが自分にとって直感的なので、御容赦願いたい。

screen とは

screen は、ぶっちゃけて言えば、仮想端末の画面…『スクリーン』を管理するモノである。 X な環境であれば複数の terminal を起動して切替えながら作業できるけれど、 これを console や terminal emulator などでやるのが、screen というわけだ。 terminal が一枚あれば、その中で複数の『ウィンドウ』を開いて作業できる。 同種のユーティリティとして window(1) などもあるが、 screen は日本語にも対応、カスタマイズの自由度も高い、などの点で優れている。 後発として tmux (ターミナル マルチプレクサ) も出てきているが、 screen もまだまだ現役である。

インストール

垂直分割機能を使わないなら、ports からのインストールを推奨。 2005.10 頃に sysutils に移動されたが、それ以前ではなぜか misc にある (他に適当なカテゴライズができなかったのだろう)。 ビルド時に気を付けることは、特にない。

垂直分割機能を使うなら、 cvs から自前でビルドする必要がある (2008.02 現在)。 手順は以下の通り。

% cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/screen co screen
% cd screen/src/
% ./configure --prefix=/usr/local
% make
% ./screen (お試し)
% sudo make install

必要に応じて terminfo/termcap の設定をするようメッセージが出るので、 おとなしく従うとよいだろう。

まっさらマシンに導入したならば、雛型設定ファイルが /usr/local/etc/screenrc あたりに入ってくるので、 これを $HOME/.screenrc としてコピーして編集して使うのがよい。

3 から 4 へのメジャーバージョン更新時に古い設定ファイルを継続利用する場合、 若干文法が変わっているので、注意が必要だ。 と言っても、変更点はクォートのつけ方程度だし、 エラー箇所はエラーメッセージが教えてくれる。 起動してエラーになった行を逐次直していけばよい。

マニュアル

man screen とすると、screen(4) が出てきてしまって笑うかもしれない。 そういう場合は、ports から入れれば info が入るので、pinfo 等で読もう。

cvs から HEAD を取得した場合には、src/doc/ の下に info ファイルがあるので、pinfo などで読もう。

はじめの一歩

screen は、特に設定なしでもコマンドを打ち込めばデフォルト設定で起動する。 起動すると、ウェルカムメッセージの後、 ウィンドウを一つ持ち、その中でログインシェルが起動している 状態になっているだろう。これが screen のセッションだ。 screen のセッションを終了するには、全てのウィンドウを終了すればよい。 各ウィンドウを終了するには、その中で動いているプログラムを終了させればよい。 要するにシェルであれば exit していけばよい。最終的に

[screen is terminating]

と表示されたら、そのセッションは無事終了したということだ。

後述するアタッチ・デタッチをより快適に利用するには、 名前を付けてセッションを開始するとよい。 名前をつけるには、引数 -S name を使用する。

% screen -S sessionname

こうすると、screen をたくさん起動していても screen -ls で簡単に識別できる。 ちなみに名無しでセッションを開始すると、無味乾燥な名前 (pid.tty.host) が 自動的に付けられる。

コマンドキー

コマンドキーは、screen への指令を送るホットキーだ。 デフォルトでは C-a に割り当てられている。 この時、screen の中で起動しているプログラムに C-a を渡すには、 C-a a と打鍵する必要がある。 emacs 方面の人やその他の C-a を多用する教義の方は、変更しておくべきだろう。 変更するには、$HOME/.screenrc で escape を定義する。 デフォルトは

escape ^Aa

のようになっていて、つまり C-a がコマンドキーになっている。 この状態で C-a を打つと、コマンドキーと解釈されて screen に取られてしまう。 Control-a をプログラムに送りたい時には、C-a a と打鍵することになる。

まず最初に、C-a ? だけは覚えておいたほうがよい。 機能名と、現在割り当てられているキーがわかる。

コロンコマンド

C-a の後に : (コロン) を打鍵することで、 screen へのコマンドを発行できる。 例えば

C-a :

としておいて

:version

のように使用する。 以降のコロンコマンドの記述では、初手の C-a はいちいち書かない (面倒なので)。

ウィンドウ操作

さて、デフォルトでは screen 起動後にはウィンドウが一つだけ存在する状態になる。 新しいウィンドウを開くには screen コマンドを使用する。

:screen

これで新しいウィンドウが開き、シェルが動いているだろう。 だが、こんなではやってられない。いちいちこんなに打ってられるか。 …という理由からか知らないが、主要な機能にはだいたいキーが割り当てられている。 新しいウィンドウを開く screen コマンドには、c が割り当てられているので

C-a c

と打鍵すれば、新しいウィンドウが開き、そこでシェルが動き出す。 ウィンドウを行ったり来たりするには、C-a C-a を使用する。

新しいウィンドウの中で動かすプログラムは、シェルでなければならない というわけではない。好きなプログラムを動かすことができる。 例えば w3m を使いたければ

:screen w3m .

のようにすれば、新しくできたウィンドウの中で w3m が動き出す。 w3m を終了せずに C-a C-a すれば、さっきまで使っていたウィンドウに戻る。 C-a c をたくさん打って、どんどんウィンドウを開いてもかまわない。 C-a C-a を叩けば、いつでも「さっきのウィンドウ」に戻る。

たくさん開いたウィンドウから目的のプログラムを見付けるには、 windowlist -b を使うとよい。この機能はデフォルトでは " に割り当てられている。 C-a " すると、今開いているウィンドウの一覧がメニューのように表示される。 このメニューは vi 同様、jk でカーソルが上下する。j で下、k で上だ。 選択して Enter で、そのウィンドウに切り替わる。

ウィンドウリストを見れば、ウィンドウに番号が付けられていることがわかるだろう。 メニュー画面では、一桁台のウィンドウを選択するには、数字キーが使える。

また、ウィンドウリストにはプログラム名も表示されていることがわかるだろう。 この名称のほうは、title (C-a A) で好きに設定することができる。

ウィンドウの切り替えは、一番頻繁に使うだけに、いろいろな方法がある。

otherC-a C-aさっきのウィンドウへ
nextC-a n次の番号のウィンドウへ
prevC-a p前の番号のウィンドウへ
selectC-a [0-9]続いて入力する番号のウィンドウへ

特に select は「C-a 番号」でウィンドウを選択できるので非常に強力で、 デフォルトで数字 0 〜 9 がすべて定義されている。 どの番号のウィンドウでどんなことをするかを、 自分ルールで決めておけば効率が非常によい。 例えば、0 番では mnews を使う、とか。

切り離し・再接続・マルチセッション

screen のセッションは detach (C-a d)で端末から切り離すことができる。

detach したセッションは screen コマンドに -x オプションを付けると 簡単に reattach (再接続) できる。

実際には -x オプションは reattach のためのオプションではなく、 マルチセッションを実現するものだ。 マルチセッションでは、全然別の端末が、同じセッションに参加できる。

screen のセッションがたくさんあると、どのセッションを再接続するのか わかりにくいので、名前を確認してアタッチするとよい。

% screen -S sessionname      (…セッションが始まる)
C-a d                        (…セッションから抜ける)
[detached]
% screen -x sessionname      (…セッションに再接続する)
C-a d
[detached]
% screen -x sessionname
C-a d
[detached]
% screen -x sessionname

サーバ上で screen のセッションを開始しておけば、 detach (C-a d) して terminal を抜けて(exit)帰り、 翌日また terminal からセッションに再接続(screen -x)、 といった使い方ができる。

が、場合によってはプロセスの寿命が長くなりすぎて、 サーバ管理者に不審に思われるかもしれない。 だから、長期間セッションを転がしておきたい場合には、 あらかじめサーバ管理者に相談しておくとよいかもしれない。

さて当該機能はマルチセッションというくらいだから、 たくさんの terminal 上で1つの screen セッションを共有できる。 サブモニタに表示した terminal と メインモニタの terminal でセッションを共有すれば、 ギャラリーから見易い簡易デモ的な使い方ができる。

それだけでなく、 異なるユーザ間で screen のセッションを共有することもできる。 例として、userX と userY がいて、 userX が screen のセッションを持っていて、これを userY と共有したい、としよう。

まず、userX のセッションで userY に許可を与える。 screen に指令を与えるために、コロンコマンドを使用する。

(userX のセッションにて)
:multiuser on
:acladd userY

次に、userY が userX のセッションに接続する。

userY % screen -ls userX/
userY % screen -x userX/pid.tty.hostname

セッション開始時に screen -S sessionname でセッション名を付けておけば、 その名前で接続することができるので便利である。

userX が userY に「参照は許すけれど操作は許したくない」といった場合は、 aclchg にて細かく設定することができる。例えば以下のような具合である。

:aclchg userY -w "#"

この例では、userY から書き込み権を剥奪している。 どの window に誰がどんな権限で接続しているか… といった情報は、 displays (C-a *) で確認することができる。

画面分割とフォーカス

split で 画面を分割することができる。 水平分割の場合は split、垂直分割の場合は split -v を使用する。 水平分割は、デフォルトでは Shift-S に割り当てられている。 垂直分割は、デフォルトでは | (パイプ) に割り当てられている。

分割したウィンドウのサイズは、resize で調整することができる。 水平分割状態であれば行数が、垂直分割状態であれば桁数が、 それぞれ変更されるようになっている。

分割された画面は、focus で渡り歩くことができる。 この機能は、デフォルトでは TAB に割り当てられている。

remove で、分割した画面を取り除くことができる。 分割をそもそも全部やめちゃいたい時には only を使う。

エンコーディング指定

screen を日本語コード変換に使用することもできる。 ローカルに kterm しか無くても、UTF 対応できるに等しい。

こらちの kterm が EUC で動いていて、そこで screen が動いているとしよう。 ssh で接続した相手が UTF-8 の場合、

:encoding utf euc

とする。すると、screen が 向こうの UTF をこちらの EUC に変換してくれる。

つまり、いちいち端末エミュレータの日本語設定を変えなくても、 各言語設定の接続先に対応できる、というわけである。

スクロールとコピーペースト

screen のセッションはウィンドウごとにスクロールバッファを持っていて、 スクロールバックしてコピーペーストすることができる。

まず copy 機能 (デフォルトでは ESC) でコピー・スクロールバックモードに入る。 すると、vi よろしく hjkl でカーソル移動できるようになる。 カーソルを動かしてスペースキーで開始位置・終了位置を指定すると 選択範囲がバッファに入る。 バッファの中身は、paste . (デフォルトでは ]) でペーストされる。

スクロールバッファの量は、$HOME/.screenrc で設定する。

defscrollback 1000

と書いておけば、1000 行ぶんだ。

ログ取得とハードコピー

log で ログ取得モードの ON/OFF が行える。 この機能は、デフォルトでは H に割り当てられている。 screen のカレントディレクトリに screenlog.n (n は window の番号) ができる。

ログファイルのファイル名は、 $HOME/.screenrc の「logfile」で好きな名前に設定できる。 フルパスで書けば、位置も設定できる。

logfile "/tmp/screen.%Y%m%d.%t.log"

各種記号の書式はマニュアル参照ということで。 また、ログを取っているウィンドウでログを tail -f したりすると狂ったことになるので、要注意。

また、hardcopy で画面のハードコピーが撮れる。 この機能は、デフォルトでは h に割り当てられている。 screen のカレントディレクトリに hardcopy.n (n は window の番号) ができる。

ハードコピーディレクトリの位置は、 $HOME/.screenrc の「hardcopydir」で好きな位置に設定できる。

デフォルトキーバインディング一覧

2008.02 頃の cvs head からデフォルトインストールした時の キーバインディングについて、一覧を示しておく。

                       Screen key bindings, page 1 of 2.

                       Command key:  ^A   Literal ^A:  a

  break       ^B b         license     ,            removebuf   =         
  clear       C            lockscreen  ^X x         reset       Z         
  colon       :            log         H            screen      ^C c      
  copy        ^[ [         login       L            select      '         
  detach      ^D d         meta        a            silence     _         
  digraph     ^V           monitor     M            split       S         
  displays    *            next        ^@ ^N sp n   suspend     ^Z z      
  dumptermcap .            number      N            time        ^T t      
  fit         F            only        Q            title       A         
  flow        ^F f         other       ^A           vbell       ^G        
  focus       ^I           pow_break   B            version     v         
  hardcopy    h            pow_detach  D            width       W         
  help        ?            prev        ^H ^P p ^?   windows     ^W w      
  history     { }          quit        \            wrap        ^R r      
  info        i            readbuf     <            writebuf    >         
  kill        K k          redisplay   ^L l         xoff        ^S s      
  lastmsg     ^M m         remove      X            xon         ^Q q      

                       Screen key bindings, page 2 of 2.

^]   paste .
"    windowlist -b
-    select -
0    select 0
1    select 1
2    select 2
3    select 3
4    select 4
5    select 5
6    select 6
7    select 7
8    select 8
9    select 9
I    login on
O    login off
]    paste .
|    split -v
:kB: focus up
[$Revision: 1.6 $ $Date: 2013.12.10 16:05:30 $]
[EOF]