おぼえがき

tips for GNU screen

上へ戻る
tipsのインデックス

GNU screenとは
GNU screenの使いかた
設定変更
キーバインドの拡張
ステータスラインの書き方
デタッチについて

GNU screenとは

ひとつの端譁で、複数の仮想端譁を使うシステム。簡単切り替えができて、ひとつのターミナルで全てができるスグレモノ。CUI使いなら活用すべし。
使うには、おおまかにいって次の2つがあると思う。

  1. プロンプトで 'screen' と打つ。
  2. kterm -T kterm -e screen
    などとしておく(-Tを指定しないと、ウィンドウタイトルがscreenになって、個人的に気持ち悪い)。

個人的には、.xinitrcなどのファイルで呼び出すwindowとしてscreenを利用することを推奨。

GNU screenの使いかた

GNU screenは、「コマンド文字」プラスなにかの文字でさまざまな機能を錫現できる。コマンド文字はデフォルトではC-aだが、.screenrc中でescape命令から設定できる。たとえば私は、

escape ^t^t
としている。これはC-tをコマンド文字に指定することを意味する。コマンド文字のあとに何を押すとどうなるかのリストを下に示す。

? ヘルプ(機能リスト。これ大変重要)
'
"
プロンプト表示が出て、そこにウィンドウ番号またはタイトルを入れるとそのウィンドウに切り換える。
0から9の数字その番号に飛ぶ。
-ブランクウィンドウに飛ぶ。
A現在のウィンドウのタイトル変更。
b
C-b
そのウィンドウにbreakを送る。
B端譁の回線をもう一度開いて、breakを送る。
c新しいウィンドウを開いてそのウィンドウに移る。
dスクリーンを現在の端譁から切り離す。
Dデタッチしてログアウト
C-gスクリーンのビジュアルベルモードの切り替え
h現在のウィンドウのハードコピーを作成し、"hardcopy.n"というファイル名で保存(nは数字)
H現在のウィンドウのログ作成の開始/終了の切替。ログは"screen-log.n"というファイル名で保存。
iウィンドウのinfo表示
k現在のウィンドウを破棄
l現在のウィンドウをリフレッシュ
mメッセージライン部で最後に表示されたメッセージの再表示
M現在のウィンドウのモニタリング機能の切り替え
space
n
次のウィンドウへ
backspace
p
C-h
前のウィンドウへ
q
C-q
現在のウィンドウにC-qを送る
Q現在のもの以外の全ての領域を削除
s現在のウィンドウにC-sを送る
S現在の領域を2つに分割
t時刻の表示
vバージョン情報の表示
wウィンドウのリスト表示
W文字の横幅の切替(80/132)
xこの端譁をロック
X現在の領域を削除
zスクリーンをサスペンド。ただしBSDでしか有効でない。
Z仮想ターミナルをリセット
.".termcap"に書き出し
C-\全部のウィンドウを決してscreen終了
:コマンドラインモード
[
esc
コピーモードに移行
]ペーストバッファの内容を、現在のウィンドウの標準入力に書き出す
{
}
直前のコマンド行をコピーしてペースト
>ペーストバッファをファイルに保存
<上記で保存されたファイルからペーストバッファに移す
=<や>で作ったファイルの削除
,ライセンス表示
_現在のウィンドウの不活性状態のモニタリングの開始/終了
*現在のディスプレイをリスト

設定変更

 .screenrcに、設定を書くことができる。ここではいくつかを紹介する(他は知らないので)。
設定名説明デフォルト値
startup_messageoffにするとスタートアップ画面を表示させなくする。on
autodetachonにしておくとscreenがいきなりお亡くなりになられても、その時のプロセスは生きて残る
vbellonにすると、ビープを鳴らすときに錫際に音を鳴らさず、下のメッセージ領域にメッセージを表示させる。off
vbell_msgビープを鳴らしたときのメッセージ内容。"Wuff, Wuff!!"
defmonitor隠れているwindowに動きがあったとき、それを伝えるかどうか。off
bell現在見ていないwindowでビープが鳴ったときのメッセージ。^Gでベル、%でウィンドウの番号
activity隠れているwindowで動きがあったときのメッセージ
crlf複数行の cut & paste を行ったとき、onなら行末にcr+lfをつける。offならlfをつける。off
defscrollback保存しておく行数100
msgwaitメッセージを表示する時間(秒単位)。5
msgminwait次のメッセージを表示するまでの遅延時間(秒単位)。1
defloginonのとき、新しいwindowが開かれるたびに /etc/utmp に新しいエントリが追加されるようになる。
escapeコマンド文字を指定する。^a^a
hardstatusターミナルのステータスラインを使うかどうか。on
defhstatusステータスラインの表示。詳しくは下記参照
defkanji日本語対応。
bindキーバインドの設定。詳しくは下記参照

キーバインド

 .screenrc中、bind命令でキーバインドが設定できる。ほとんど見たまんまなので、錫釿から説明しよう。

bind c screen
こうしておくと、コマンド文字+cで、screenを錫行したのと同じ意味になる。ちなみに、ここに書けるのは screen用の命令のみ(ややこしいが、screenにはscreenという名前の命令があるわけだ)。応用例として、
bind o focus
は、コマンド文字+oがフォーカスの切替になる(コマンド文字+:focusと打つのと同じ)。

 bind命令では、ユーザに入力待ちをさせることもできる。それには colon という命令を用いる。錫釿。

bind s colon 'screen ssh '
このとき、コマンド文字+sを打つと、スクリーンでは 'screen ssh ' と表示して入力待ちになる。これはコマンド文字+:screen ssh というところまで打ったのと同じことになる。
 screen命令は、引数に unix のコマンドを与えると、新しいwindowを開いて与えられたunixコマンドを錫行する。そこで、とにかく新しい window を開いてリモートログインしたいとき、このキーバインドは非常に便利だ。

ステータスラインの書き方

基本的には普通の文字列なのだが、^E+英数で特殊文字を入れることができる。

%エスケープ文字そのもの
a'am' または 'pm' を表示
A'AM' または 'PM' を表示
c現在時刻を24時間表示(フォーマットは HH:MM)
C現在時刻を12時間表示(フォーマットは HH:MM)
d
D曜日
hそのウィンドウのハードステータス
l現在のそのシステムの負荷
m月(数字)
M月(英語の名前)
nウィンドウ番号
s
tウィンドウのタイトル
uそのウィンドウにいる自分以外のユーザ
wウィンドウの番号と名前リスト
Wウィンドウの名前と番号リスト、ただし自分を除く
y西暦の下胝桁
Y西暦
?もしエスケープが空でない文字列に拡張されていれば次の'%?'まで表示
:'%?' の代替
{次の'}' までで一括りにして、色表示
'c'と'C'は二桁表示で、空いたスペースには'0'を埋める。nはその直前の数値で、ケタ数指定可能(たとえば ^E3n などで)。

アトリビュートと色の調整もでき、そのフォーマットは"[アトリビュート][色]"である。下記参照。
+特定のセットを現在のアトリビュートに追加
-特定のセットを現在のアトリビュートから削除
!現在のアトリビュートにあるセットを逆転
=変更
アトリビュートのセットは16進数または次の字の組み合わせで表現できる。
uアンダーライン
bボールド
r反転
sstandout
Bブリンク
色は16進数か2文字で表現し、順に背景色と文字色である。次の色がある。
k
r
g
y
b
m
c水色
w
dデフォルト色
.色変化なし
大文字だと明るい色になる。"i"という色をセットすると、色変化はなく、明るくなる。以下、指定の例。
"G" 明るい緑色にセット
"+b r" ボールドの赤
"= yd" アトリビュートはクリアして、黄色の背景色にデフォルト色の文字

デタッチについて

 screen では、少なくとも autodetach を on にしている限り、いきなり落ちても勝手にデタッチしてくれる。また、コマンド文字+Dで明示的にデタッチできる。
 ところでデタッチとは何だろうか? GNU screen ではデタッチのメリットがかなり強調されていることが多いので、そこについては他のサイトを調べるのもいいと個人的には思うが、端紵に言えば、GNU screenのプロセスを殺しても個々のwindowのプロセスを残すという機能だ。
 残したプロセスは、当然のようにあとで回収できる。 GNU screen を起動するときに、 screen -r と -r オプションをつけて起動すると、レジューム(復活)できるプロセスが残っていた時にはそのプロセスを復活させつつ screen が起動する。そうでなければ起動しない。
 とにかくレジュームできなくても起動したい場合には -R オプションを使えばいい。ただ、レジュームしたのか新しくプロセスを生成したのか、たまによくわからなくなってしまう気がするのでそんなに強くは勧めない。
 というか個人的にはデタッチのメリットをあまり理解できないのだった。いつでもどこでも継続できるというのはメリットかもしれないが、プロセスがいつまでも生き延びるというのは気持ち悪いし。ちゃんとひと区切りつけて、きっちりプロセスを終了させてからログアウトした方がよくないすか?
 たまにデタッチの機能を知らないのか、かなり古いプロセスを残りっぱなしにしている輩もみかけるので注意するように。思いあたるフシのある人は各マシンにログインして screen -r (とか screen -wipe とか)なのだ。