$Id: text.rd,v 1.10 2001/11/04 16:57:07 zinnia Exp $
本稿では、Screenとはどのようなソフトで、どのようなことが できるのかを紹介します。
Screenのすべてを紹介することはできませんが、 自由な発想でScreenを活用できるために必要な道具は ひととおり紹介したいと思っています。
Screenとは、(KTermなどの)1つの端末の中に仮想的な端末 (ウインドウ)を作り、操作をすることができるウインドウマネージャです。 以下のような特徴があります。
Screenはウインドウの集まりを「セッション」として管理しています。 セッションと端末は柔軟に結びつけ、切離すことができます。例えば
といったことが可能です。セッションが端末から切離されても、 中のプログラムは動き続けています。
物理端末は、Screenが動くことのできる(本物の)端末です。 KTerm、ETerm、rxvt、mlterm、などなど、です。
Screenは端末の中でウインドウと呼ばれる仮想端末を作ります。 ウインドウにはそれぞれ番号がついており、名前をつけることができます。
Screenに対する指示をコマンドといいます。コマンドは次に述べる 「コマンドキー」 + 「別のキー」のシーケンスに割当てることができます。 また、コマンド名を直接指定してScreenに指示することもできます。 コマンドの詳細は後述します。
Screenのコマンドを発行するために最初に入力する文字です。 デフォルトでは^Aとなっています。escapeコマンドで指定します。
なお、Screenのコマンドでは「^」 + 「文字」という表記を <CTRL> + 「文字」と理解します。本記事でもこの表記に 従っています。
「コマンドキー」で指定された文字そのものを入力したいときに 使う文字を指定します。デフォルトでは「a」になっております。 たとえば、コマンドキーが^Aで、リテラルがaのときに、^Aそのものを 入力したければ^Aaとすればよいことに なります。リテラルもescapeコマンドで指定します。
コピーコマンドなどで取り込んだ文字列を保存しておくための領域を レジスタといいます。レジスタにはキー(名前)がついており、複数の レジスタを管理することができます。
Screenに対する指示の応答のための行をメッセージラインといいます。 メッセージラインは、 ステータスライン*1、端末の中(最下行)、などに 表示させることができます。 メッセージラインを常に表示させた状態にすることもできますが、 デフォルトでは必要に応じて表示され、一定時間の後に消えます。
1つのScreenが管理しているウインドウの集まりをセッションと呼びます。 セッションは端末に結びついていますが(アタッチ)、これを 切離したり(デタッチ)、再接続させたり(レジューム)することができます。
物理端末です。Screenのドキュメントでは、特にScreenのセッションに 結びつけられた端末のことをディスプレイと呼ぶようです。
セッションが端末に結びつけること、またはその状態です。
セッションを端末から切離すこと、またはその状態です。
デタッチされたセッションを端末に再接続させることをレジュームといいます。
ウインドウが操作可能な状態にあることをいいます。
コマンド実行 (colon)
ヘルプ(help)
コピー(copy)
ペースト(paste)
コマンド文字そのものを出力
タイトル変更(title)
クリア(clear)
ウインドウ作成(screen)
Screen終了(quit)
直前にアクティブだったウインドウに切替(other)
デタッチ(detach)
パワーデタッチ(pow_detach)
フロー制御の変更(on/off/auto)
ベルの変更(audible/visual)
ウインドウの情報(info)
ウインドウを閉じる(kill)
再表示(redisplay)
直前のメッセージを表示(lastmsg)
前のウインドウへ(prev)
次のウインドウへ(next)
時刻とロードアベレージの表示(time)
ウインドウ一覧の表示(windows)
端末のロック(lockscreen)
サスペンド(suspend)
ログ(log)
モニタのon/off(monitor)
端末のリセット(reset)
配布ファイルの中にはソースはもちろん、たくさんの有益な ドキュメントが含まれています。Screenのマスターサイト <URL:http://www.gnu.org/software/screen/>を参考に、 手近のミラーサイトから入手してください。 *2
記事執筆現在の最新版は3.9.10です。(他の多くのソフトの配布ファイルと同様に) 配布ファイル内のNEWSというファイルを読むことで、以前の版からの変更点を手軽に 知ることができます。新しい機能が追加されたときは簡単な使いかたも説明して ありますので、バージョンアップのたびにチェックするようにしましょう。
Screenが動いてる端末で ^A? とすることでヘルプを見ることができます。
写真1: help1.tiff ヘルプ画面1 写真2: help2.tiff ヘルプ画面2
上にある「Command key: ^A Literal ^A: a」で、 コマンドキーが^Aで、^Aそのものを入力したいときは^Aaと入力すれば よいことが分かります。
ヘルプの内容は「コマンド名とキーの対応表」です。 「time t」とありますから、^Atとやるとtimeというコマンドが実行される ことが分かります。 timeコマンドはinfoやマニュアルを見れば分かる通り、 時刻、ホスト名、load average、を表示するコマンドです。
コマンドは、だいたいの動作が想像つくような名前がついています (少なくともマニュアルを引くための手がかりになります)から、 慣れないうちはヘルプを見ることで「自分のやりたいことはどういう キー操作でできるのか」ということを知ることができます。
逆に「あのキー操作はどういうコマンド名になっているのか」 ということを知るためにヘルプを見る、といった使いかたもできるわけです。
Screenにはとても素晴しいinfoがついております。 Screenとはいかなるもので、どのようなことができて、それを どのように使うのかということが網羅されています。つまりここで 私が書こうとしていることは、ほとんどがinfoにも書かれているということです。
一度は目を通しておいて、どんなことが書かれているかを 把握しておくことをおすすめします。
infoほど詳細ではありませんが、コマンドライン引数や Screenのコマンドに関する一通りの説明があります。 分量が少ないのでまずこちらをあたってから、infoを 調べるというのがいいのかもしれません。
JMプロジェクトの成果により和訳されたマニュアルを 入手することができます。 <URL:http://www.linux.or.jp/JM/html/GNU_screen/man1/screen.1.html>
ほとんどのディストリビューションではパッケージが用意されているでしょうから そちらを利用することもできます。 ここではソースからのインストールのみを解説します。 例としてDebian GNU/Linux 2.2を使用します。
ソースからのインストールでは、他のGNU softwareと同様に、 configureスクリプトで設定を行った後にmakeを行い、 rootになってmake install、でOkです。
% tar zxvfp screen-3.9.10.tar.gz % cd screen-3.9.10 % ./configure % make % su # make install
make installの最後に
termcap entry (./terminfo/screencap) should be installed manually. You may also want to install ./etc/etcscreenrc in /usr/local/etc/screenrc
といったメッセージが表示されます。必要に応じてtermcapエントリを 追加してください。*3
設定ファイル(screenrc)については、指定された場所にコピーしておきます。 /usr/local/etc/screenrc は、サイトで共通の設定を置き、 $HOME/.screenrcに各自の設定を置くという使いかたをするとよいでしょう。 または、$HOME/.screenrcに./etc/etcscreenrcの中身を入れて、 それを編集するというやりかたもあると思います。 サイトの運営方針に合った方法を使ってください。 *4
本稿では、以後、.screenrc と書いた場合はホームディレクトリの .screenrc を指すものとします。
設定ファイル内(.screenrc)でとりあえず指定しておきたいものを 以下にまとめておきました。
Screenのコマンドを呼び出すために最初に入力する文字です。 「用語の説明」でも述べた通り、デフォルトでは、 コマンドキーが^A、リテラルがaとなっております。
コマンドキーとリテラルはescapeというコマンドで指定できます。 たとえば
escape ^Tt
とすると、コマンドキーを^T、リテラルをtとすることができます。 このとき、「^T」は「^T」という文字、ではなく 「^」と「T」の二文字をそのまま入力します。 *5
コマンドキーのデフォルトの^Aは、emacs系のエディタやシェルなどで 「行頭に移動」するために割と頻繁に使う人が多いと思います。 Screenの中で「行頭に移動」するために、わざわざ^Aaと入力しなければ ならないのは面倒だ、という場合は、上記のコマンドで 自分が普段あまり使っていないキーを割当てるようにしてみて下さい。 *6
なお本稿ではデフォルトの
escape ^Aa
をそのまま使うことにしますので、皆さんの環境に合うように 適宜読み換えるようにしてください。
Screenでは、端末のステータスラインが使えればそこをメッセージラインとして 使います。
写真3: messageline-statusline.tiff メッセージライン(ステータスラインに表示)
ステータスラインが使えない場合は端末の最下行を表示のために使用します。
termcap kterm hs@ terminfo kterm hs@
という設定を.screenrcに入れておくことで、ステータスラインを 使わずに、端末の最下行をメッセージラインとして使うことができます。
写真4: messageline-term.tiff メッセージライン(端末の最下行に表示)
また、
termcap kterm 'hs:ts=\E]2;:fs=\007:ds=\E]0;screen\007' terminfo kterm 'hs:ts=\E]2;:fs=\007:ds=\E]0;screen\007'
とすることでタイトルバーをステータスラインの代わりに使うことができます。
写真5: messageline-title.tiff メッセージライン(タイトルバーに表示)
本稿の画面写真では、端末の最下行をメッセージラインとした設定をしたときの 表示を使用しています。
Screenで日本語を正しく表示させるためにはtermcap/terminfoの KJエントリにエンコーディングを指定する必要があります。 Screenではkanjiと、defkanjiというコマンドがこの設定をしてくれます (termcap/terminfoコマンドで設定することもできます) kanjiコマンドはアクティブなウインドウのエンコーディングを指定します。 defkanjiは、新しくウインドウを作成するときのデフォルトのエンコーディングを 指定します。 どちらのコマンドも、指定できるのは、jis、euc、sjisのいずれかです。 eucに設定したいときは、
kanji euc defkanji euc
というコマンドを.screenrcに書いておきましょう。
なお、screen (-r, -x)でレジュームしたときに 表示が崩れるといったときも、kanjiコマンドを送りなおしてから (^A:kanji euc)、再表示(^L)することで復帰させることができます。
Screenに対する指示はコマンドによって行います。 例えば「次のウインドウに切替」という指示は「prev」というコマンドを Screenに送ることで実現されます。 コマンドを送る方法には以下のような方法があります。
.screenrc に、Screenのコマンドを記述することで、 Screenの起動時にそれらが順番に実行されます。
Screenのコマンドは、「コマンドキー + 文字」に割当てることが できます。例えば、prevコマンドはデフォルトで ^A^P と、^Apに 割当てられています。
キーの割当ての変更はbindコマンドによって行います。 例えば
bind P prev
というコマンドを.screenrcに入れておくと、^AP でも 「前のウインドウに切替」が実行できます。
^A: には colon というコマンドが割当てられています。 colonコマンドでは、Screenのコマンドをその場で実行させることができます。 例えば、^A:prev とすると、prevコマンドが実行され、 前のウインドウに切り替えることができます。
-X コマンドラインオプションを与えてScreenを実行することで、 Screenのセッションの外からでもコマンドを送ることができます。
Screenの動いている端末とは別の端末のシェルから
% screen -X prev
というコマンドを実行すると、Screenでprevコマンドが実行させることができます。 この機能はバージョン3.9.9から追加されたものです。
Screenのコマンドラインオプションのうち、比較的よく使うものを 以下に示します。
ユーザ設定ファイル名の指定。デフォルトでは$HOME/.screenrcです。
指定したセッションをデタッチします。
指定したセッションをパワーデタッチします。
指定された文字列MATCHにマッチするセッションのリストを表示します。 MATCHは省略可能です。
デタッチされたセッションにレジュームします。複数のセッションが 存在する場合は、レジュームしたいセッション名をオプションで指定します。
他のユーザのセッションにレジュームを試みます。
レジュームを試みますが、レジュームできるセッションが見つからなかった 場合は通常通りセッションを作成します。
ウインドウのタイトルを指定します。shelltitleコマンドと同義です。
バージョン番号を表示します。
「死んだ」セッションを掃除します。screen -lsで(Dead)と 表示されたセッションが該当します。
マルチディスプレイモードでアタッチします。
指定されたCOMMAND文字列をScreenのセッションに送ります。 このオプションはバージョン3.9.9に新設されました。
前置きがずいぶんと長くなってしまいましたが、 いよいよScreenを使ってみましょう。 この節ではScreenの基本となる操作を同時体験できる形式で 紹介します。端末はKTermを使います。
では早速Screenを起動してみましょう。
% screen
とすると、写真のようなタイトル画面が出てきます。
写真6: opening.tiff オープニング画面
ここでリターンを押すと、シェルのプロンプトが出た状態になります。
写真7: init.tiff Screen起動直後の状態
このシェルは「Screenの中で動いているシェル」です。 ウインドウを1つ作成して、その中でシェルを起動する、というのが Screenのデフォルトの動作です。
何か適当なコマンド、たとえばlsを実行してみます。
写真8: shot-ls.tiff lsを実行した状態
その後に、^Ac と入力してみましょう。 すると、今まで出ていたコマンドの結果が消えて、シェルのプロンプトが 出てきたと思います。^Acは画面をクリアするためのコマンド、ではなく、 「新しいウインドウを作成してそこでシェルを起動する」コマンドです。 便宜上、最初にlsを実行したウインドウを「ウインドウ0」、 新しく作成されたウインドウを「ウインドウ1」と呼ぶことにします。
では新しく出来たウインドウ1で何か別のコマンド実行してみましょう。 今度は少し動きのあるコマンド、ということでtopにしてみましょうか。
写真9: shot-top.tiff 別のウインドウでtopを実行した状態
その後に、^A^A と入力してみます。すると、先程まで動いていた ウインドウ0が見えると思います。 topの動いているウインドウ1は見えなくなってしまいましたが、 topそのものは動き続けています。
もう一度^A^Aを入力してみます。またウインドウ1に戻ってきたはずです。 topは動き続けていますね。
図1: 2つのウインドウが開いた状態 ^A^Aで切替 ウインドウ0 ←−−−−−→ ウインドウ1 ls top
このように、Screenでは複数のウインドウを1つのディスプレイで管理し、 手軽に切り替えたり増減させたり、といったことを可能にするソフトなのです。
^A^A を押すと、ウインドウ0とウインドウ1を行ったり来たりすることが 分かりました。では、ウインドウ0が表示された状態で、 さらにもう1つウインドウを作ってみましょう。ウインドウを 作るためのコマンドは^Ac ですよ。出来たウインドウを 「ウインドウ2」と呼ぶことにします。
この状態で^A^Aを押すことで、ウインドウ2とウインドウ0を行ったり 来たりすることができます(図2)。ではウインドウ1に移動するには どうすればいいのでしょうか?
図2: ウインドウ2を作成 ウインドウ0 ウインドウ1 ls top \ \ ^Ac で作成 ↓ ウインドウ2 ウインドウ0 ウインドウ1 ls top ↑ \ \ ^A^Aで切替 \ ↓ ウインドウ2
実はScreenでは、ウインドウごとに番号がつけられています。 最初に出来たウインドウの番号は0、次は1、2…という風に。 現在の状態では、「ウインドウ0」のウインドウ番号は0、 「ウインドウ1」のウインドウ番号は1、「ウインドウ2」のウインドウ番号は2、 となっています。
このウインドウの番号を利用して、ウインドウの切替をすることができます。 では、^A1 と入力してみてください。topの画面が出てきましたか? ウインドウ1に戻ってくることができました。 同様に、^A0 とするとウインドウ0、^A2とするとウインドウ2に切り替える ことができることを確認してください。(図3)
図3: ウインドウ番号を指定してウインドウを切替 ^A1 ウインドウ0 −−−−−→ ウインドウ1 ls top ↑ / / ^A1 / ウインドウ2
最初に使っていた^A^Aという操作は、「直前にアクティブだったウインドウに 切り替える」という操作になります。 ^A0 でウインドウ0に移動してから、^A2 でウインドウ2に切り替えた後に、 ^A^Aを押すとウインドウ0に戻ることがわかります。
「次/前のウインドウ番号に切り替え」という切り替えかたもあります。 ウインドウ0に移動してから、^An と入力すると ウインドウ1に切り替わります(次に切り替え)。 ウインドウ2に移動してから、^Ap と入力すると、 ウインドウ1に切り替わります(前に切り替え)。(図4、5)
^Ap は ^A^P でもよいことになっています。また、 ^Anは、^A^N、または^A<SPACE>でも同じです。
図4: 「次のウインドウ」に切替 ^An ウインドウ0 −−−−−→ ウインドウ1 ls top ↑ / \ ^An / ^An \ / \ ↓ ウインドウ2 図5: 「前のウインドウ」に切替 ^Ap ウインドウ0 ←−−−−− ウインドウ1 ls top \ ↑ \ ^Ap / ^Ap \ / ↓ / ウインドウ2
もう1つコマンドを紹介します。 ^Aw (または^A^W) は、ウインドウの一覧を見るためのコマンドです。
メッセージラインに
0-$ zsh 1$ zsh 2*$ zsh
と表示され、しばらくすると消えたと思います。 この一覧の見方は、
といった感じです。今回の例では0番〜2番の3つのウインドウがあり、 タイトルはいずれも「zsh」となっています。ウインドウのタイトルは、 何も指定しなければ起動したときのシェルの名前になっています。
「変な記号」については、とりあえず以下の3つを覚えておいてください。
アクティブなウインドウ
直前にアクティブだったウインドウ (^A^A で切り替えられるウインドウ)
BELLキャラクタを受信したウインドウ (そのウインドウがアクティブになると消えます)
ここまでの操作をまとめておきます。括弧の中は 対応するコマンド名です。
新しいウインドウを作成 (screen)
直前にアクティブだったウインドウに切り替え(other)
指定した番号のウインドウに切り替え(select)
次のウインドウ番号に切り替え (next)
前のウインドウ番号に切り替え (prev)
ウインドウの一覧を表示 (windows)
前節で3つのウインドウを作り、それらが1つのディスプレイの中で切り替えつつ 自由にいじることができることを知りました。 今でもウインドウ1でtopは動いているでしょうか。 動いていなかったらもう一度起動してください。
図6: ディプレイとセッション ディスプレイ(KTerm) ↑ ↓ セッション ウインドウ 0, 1, 2
さて、(少々乱暴ですが)Screenの動いているKTermを閉じてみましょう。 ウインドウマネージャから「閉じる」操作をするとか、別の端末から KTermをkillする、といった方法で無理矢理KTermを終了させてみてください。 *8
図7: KTermが終了した状態 ディスプレイなし ↑ × ↓ セッション ウインドウ 0, 1, 2
無事に(?)KTermが終了したら、もう1回KTermを起動してください。 もちろんここではScreenは動いていません。ではここで、 再度Screenを起動させます。ただし今度は-rオプションつきです。
% screen -r
先程(強制的に)閉じられてしまったKTermの中で動いていた Screenに復帰しましたか?ウインドウ1でtopが動きつづけていたら成功です。
このように、Screenのセッションは、ディスプレイから 切離された状態(デタッチ状態)でも (止まらずに)動き続けることができ、またそのような切離されたセッションはいつでも 他のディスプレイ(もちろん同じディスプレイでもよい)に再接続(レジューム)する ことができます。
Screenなしでこのようなことをするのは大変困難です。 nohup(1)やdisown(zshのビルトインコマンド)を使えば、 端末がいなくなっても中のプログラムを動き続けさせることができますが、 そのプログラムをまた別の端末につなげなおすことはできません。 リダイレクトやtee(1)で出力をファイルに落とすようにしておいて、 その中身を見てコマンドが終わったとか終わらないとかを判断するくらいなら できるかもしれませんが、 いずれも「前もって準備しとけば」なんとかなる、というものでしょう。 nohupやdisownを忘れていたら中のプログラムは端末と一緒に死んでしまうし、 出力をファイル経由で見られるようにしておかなければ、あとは たまにpsで確認するくらいしか手がないでしょう。
しかしScreenが動いていれば、上で見たようにいきなりKTermを落として しまうような乱暴なことをしても、すぐに別の端末からつなげなおすことが できます。出力の結果のチェックどころか、作業の続きをすることだって できてしまいます。 infoの中で「Screenの中でたぶん最も便利な機能」と言っているのも 納得でしょう。
え?「『Screenの中で動かす』というのも『準備』には違いないではないか」? そんな貴方が「ログインしたら/KTerm上げたらまずscreen (-r)」という ふうになってもらうことを私は祈りつつこの記事を書いています。
先程は端末を無理矢理終了させてみましたが、他にも ネットワーク越しにいじっていて回線が切れてしまった、といった 不慮の事故からプログラムを守ることができます。
また、「セッションをディスプレイから切断させる(デタッチ)」コマンドも あります。ここではdetachのためのコマンドを紹介します。
デタッチした後、Screenを終了します。 (detach)
デタッチした後、Screenが動いていた端末にHUPシグナルを送ります。(pow_detach)
いずれの場合も、デタッチされたScreenのセッションをレジュームするには
% screen -r
とします。
Screenは、各々のウインドウごとにコピーアンドペーストのバッファを 持っています。簡単に言うと
を、Screenがサポートしているということです。ここではその触りの部分だけを 紹介します。まずはコマンドの一覧から。
コピーモードに入ります(copy)。コピーモードではウインドウの中で動いている アプリケーションとは関係なく、自由にカーソルを移動させることができます。 バックスクロールもできます。
コピーモードでスペースまたはリターンキーを押すと、その位置が コピー開始位置になります。
さらにカーソルを移動させてスペースまたはリターンキーを押すと、 コピー終了位置が確定し、コピー開始位置から終了位置までが コピーバッファにコピーされます。
コピーバッファにコピーされたテキストをペーストします。(paste)
コピーバッファはセッションで共通です。つまりあるウインドウで コピーしたテキストを別のウインドウにペーストすることができます。
コピーモードでは / でテキストの検索ができます。 また、C-r でインクリメンタルサーチ(逆方向)ができます。
私はさらに、コピーモードでのカーソル移動をEmacs風にするために、 .screenrcに
markkeys 'h=^B:l=^F:$=^E:^U=^Z:^D=^V'
という設定を加えています*9。
コピーモードは、それだけでひとつのページャが出来てしまいそうなほど 豊富な機能を持っています。詳しくはinfoを見てください。
ウインドウは、それが作られたときに起動されたプログラムが終了すると 自動的に閉じられます。
ウインドウ0でexitと入力し、シェルを終了した後、 ^Aw でウインドウの一覧を見てみましょう。0番のウインドウが消えていることが 分かります。
1-$ zsh 2*$ zsh
また、^AK (kill)でアクティブなウインドウを強制的に閉じることができます。
すべてのウインドウが閉じられるとScreenは終了します。 また、^A\ (quit)でScreenを強制的に終了することができます。
^Ac または ^A^C で新しいウインドウを作成できることは すでに説明しました。これらのキーにはscreenというコマンドが 割当てられています。
新しいウインドウを作成します。[opts]には Screenのコマンドラインオプション(の一部)を指定することができます。
[n] は、新しいウインドウにつけるウインドウの番号(0〜9まで)を 指定することができます。その番号がすでに使われていた場合は、 他の番号を探して割当てられます。
[cmd [args]] は、新しいウインドウで起動したいコマンドラインと その引数を指定します。省略された場合はシェルが起動されます。
例えば、.screenrcに
screen -t EMACS 0 emacs -nw
という行を入れておくと、Screen開始時に「EMACS」という名前で ウインドウが作られ、emacs -nwが起動します。このウインドウは 0番に割当てられます。もし0番がすでに使われていたら1番、 1番も使われていた2番...と、空いている番号を見つけるまで繰り返します。 emacs が終了するとこのウインドウも閉じられます。
Screenのセッションの中で動いているシェルからScreenを起動すると、 新しいウインドウを作成することができます。
% screen top
と実行すると、新しいウインドウを作成してtopを実行します。 topが終了すると、このウインドウも閉じられます。
screenを-dオプションつきで起動することで、既に起動している Screenのセッションをデタッチさせることができます。
写真10: remote-detach.tiff 左上の小さいKTermから、真中のKTermで動いているScreenをdetachさせた様子。 [remote detached]のメッセージに注目 図8: リモートからデタッチ ディスプレイ(KTerm) ↑ × ←−−−−−− 別の端末からscreen -d でデタッチさせる ↓ セッション ウインドウ 0, 1, 2
Screenでは、1つのセッションを複数の端末から操作することができます (マルチディスプレイ)。さらに、複数のユーザで1つのセッションを 共有することもできます(マルチユーザ)。
ここでは、マルチディスプレイ、つまり 「一人のユーザが複数の端末から1つのセッションを操作する」方法を解説します。
まずKTermを1つあげ、Screenを実行します。もう1つKTermをあげ、 -x オプションつきでScreenを起動します。
% screen -x 写真11: multi-display.tiff マルチディスレイの様子。 上下2つのKTermで同じウインドウが表示されています。
写真では分かりづらいですが、上のKTermと下のKTermは 同じセッションのウインドウを表示しています。 実際に試してみると、 片方のKTermで何かを入力すると反対側のKTermにも同じものが入力されるのが 分かると思います。
2つのKTermで、同じセッションの異なるウインドウを操作することも もちろん可能です。
screen -r (レジューム) と screen -x は、 既にアタッチされているセッションに接続することが出来ない(-r)か 出来る(-x)か、という違いがあります。
図9: マルチディスプレイ ディスプレイ1(KTerm) ディスプレイ2(KTerm) \ / \ / セッション ウインドウ 0, 1, 2
% screen -ls
とすることで、セッションの一覧を見ることができます。
zinnia@debian:~[26]% screen -ls There are screens on: 302.ttyp0.debian (Detached) 418.ttyp4.debian (Attached) 2 Sockets in /tmp/screens/S-zinnia.
ここでは2つのセッションがあり、一つは302.ttyp0.debianという名前で、 端末から切離されており(Detached)、 もう一つは418.ttyp4.debianという名前で、 端末に接続している(Attached)ということが分かります。
複数のScreenのセッションがあるときに、リモートからのデタッチ(-d)、 レジューム(-r)、マルチディスプレイで接続(-x)、コマンドの 実行(-X)などを実行しようとすると、
zinnia@debian:~[17]% screen -x There are several suitable screens on: 302.ttyp0.debian (Detached) 418.ttyp4.debian (Attached) Type "screen [-d] -r [pid.]tty.host" to resume one of them.
といったエラーメッセージが表示されます。この場合、 接続できるセッションが2つあるため、どちらかを指定しなければ いけません。
例えば2つめのセッション(418.ttyp4.debian) に接続したいときは、
% screen -x 418
または、
% screen -x ttyp4
などとすればOkです *10
Screenのセッションの中ではSTYという環境変数が自分のセッション名を 保持しています。 STYが存在することでScreenのセッションの中にいることが分かり、 STYの中身を見ることでScreenのセッション名が分かります。
ウインドウのタイトルは以下の方法で設定することができます。
screenコマンドは、新しいウインドウを作成するコマンドです。 -t オプションをつけることで、そのウインドウのタイトルを 指定することができます。 詳しくは前節「起動時にウインドウを作成」を御覧下さい。
titleコマンドで、ウインドウのタイトルを設定することができます。 ^AA と入力すると
Set window's title to:
というプロンプトがメッセージラインに表示されますので 新しいタイトルを入力することでタイトルを設定することができます。
^A:title [設定したいタイトル] とすることもできます。
<ESC>k文字列<ESC>\ という文字列を出力することで ウインドウのタイトルを変えることができます。
写真12: エスケープシーケンスでタイトルを変える
シェルのプロンプトなどに仕掛けるとタイトルを動的に変えることができます。
ここでは端末のロック、パスワードによるセッションの保護の 基本的な考えかたを解説します。
それぞれの機能がどのような性質を持ち、それを使うことで 何を守ることができるのかということを知っておくことは有益でしょう。
lockscreenコマンド(^Ax または ^A^X) で、 端末にロックをかけることができます。
このときScreenは '/local/bin/lck' または '/usr/bin/lock'を呼ぼうと します。どちらも見つからないときは、内蔵のロック機能を 呼び出します。
これらの呼び出しから戻るまでは端末の操作ができなくなります。 ただし、他の端末からscreen -d -r などでセッションを奪うことで ロックは無効になってしまいます。あくまで「端末」のロックである ということに注意してください(infoにも明記されております)。
セッションを守るためには、次節のパスワードを利用します。
passwordコマンドを使うことによって Screenのセッションをパスワードで保護することができます。
password [パスワード]
passwordコマンドに暗号化されたパスワード *11 を与えることでパスワードを設定します。 また、パスワードに「none」を指定するとパスワードの保護を無効に することができます。
さて、その「暗号化されたパスワード」ですが、作りかたは以下の通りです。
パスワードが設定されると「[ Password moved into copybuffer ]」という メッセージがメッセージラインに出力されます。 pasteコマンド(^A])を実行すると を入力すると「VTlC8unoeKES6」などといった 文字列が出力されるはずです。これが暗号化されたパスワードです。
あとは、.screenrcに
password VTlC8unoeKES6
と書いておけば、セッションはパスワードで守ることができます。
パスワードで守られたセッションでは以下の操作は拒否されます。
以下の操作は正しいパスワードを入力しなければ拒否されます *13。
また、lockscreen(^Ax または ^A^X)では、ユーザのパスワードと セッションのパスワードの両方に正しく答えないと復帰できなくなります。
本節では、コンソールアプリケーションの紹介と、 特に「Screenとの組み合わせ」にスポットをあてた使いかたを紹介します。
単に「こんな使いかたができるよ」というだけではなく、 Screenと、その中で動くアプリケーションでできることを把握し、 それを結びつけるためのアプローチを体得していただきたい、という ことを「ねらい」としています。 そのため、事例の説明などが多少冗長に感じられるかもしれませんがご理解下さい。
考えかたとしては、あるアプリケーションからScreenの機能を利用することで、 アプリケーション単体では実現が難しいが、できたらとても便利なことを 実現させる、というふうになります。
御存知の方も多いと思いますが、Emacs(またはXEmacs)を-nwオプションつきで 起動すると、新しいXのウインドウを作らずにコンソールの中でEmacsが起動します。
Xのウインドウとして起動した場合と比べると、マウスでの操作や 色遣いに若干の不自由さが出てきますが、どちらもまったく駄目というわけではなく、 設定次第でかなりの程度は使えるようになります。 私のEmacs21(-nw)での画面の例は以下のような感じです。
写真13: Emacs21 (-nw)の様子
Screenの中で動くEmacsは、別のウインドウで動いているアプリケーションの 外部エディタとして使うこともできます。 「Emacsは便利だけど、他のアプリケーションの外部エディタとして使うには 起動が重くて嫌だ」、という場合は、emacsclientを使ってみましょう。
.emacsに
(server-start)
という行を追加しておきます。
別のシェルから
% emacsclient some.txt
としてemacsclientを実行すると、
Waiting for Emacs...
と表示されて待ち状態に入ります。
写真14: emacsclientでEmacsに接続した状態
Emacs側にはsome.txt が開かれていることが分かります。 編集が終わったら^X# とするとemacsclientが終了します。
emacsclientの起動は一瞬ですからアプリケーションの外部エディタとして 使用してもストレスはないでしょう。私は環境変数EDITORを emacsclientにしています。
XEmacsの場合はgnuserv/gnuclientという同様のサーバ/クライアント 環境が入っています。gnuclientは起動したその場でバッファを開いて編集することができます。
tailというコマンドを御存知でしょうか?UNIX Version 7の頃から あるという「ファイルの最後の部分を表示する」プログラムです。 *14
% cat > file a b c d e f ^D % tail -n 2 file d e %
このように、ファイルの最後の数行を表示させるといった使いかたが できるtailですが*15、 他にも-fオプションを使うことで「ファイルの末尾を表示し続ける」 ことができます。つまり、指定されたファイルの最後を表示した状態で 待機して、新しい行が追加されるたびにそれを表示することができます。
これを使うことで、ファイルの出力を監視することができます。 ウインドウを、tailのために1つあげておいて、 各種ログファイル(/var/log/messages、apacheのErrorLogやCustomLogなどなど)を tail -f で監視する、といった使いかたができます。
写真17: tail.tiff tailで/var/log/messagesを監視している様子
また、Screenにはmonitorというコマンドがあります。 そのウインドウがアクティブでないときにウインドウの状態が変化すると メッセージラインで知らせてくれます。
Activity in window 0
このとき、ウインドウの一覧(^A^W)を見ると、該当するウインドウには @というマークがついています。
0@$ console 1*$ zsh
monitorコマンド、または^AM と入力することで アクティブなウインドウのモニタモードのon/offを 切り替えることができます。つまり、
screen -t console tail -f /var/log/messages monitor on
という設定を.screenrcに入れておくと、/var/log/messagesに 新しいメッセージが来るたびにメッセージラインとウインドウ一覧で 知らせてくれるようになります。
w3m<URL:http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/>は、 aitoさんによるページャ/テキストベースWWWブラウザです。 *16 WWWのブラウジングをw3mメインにすることでコンソールへの 依存度も増えることでしょう。とにかく一度使ってみることを おすすめします。
Screenと同様に、キーバインドと機能を細かく設定することができ 工夫次第で手に馴染む自分好みのブラウザにすることができます。
また、坂本浩則さんによるインライン画像表示パッチ <URL:http://www2u.biglobe.ne.jp/~hsaka/w3m/index-ja.html>を 使うことで画像の表示もできます。
以下に w3mとScreenの組み合わせについて とりあげてみたいと思います。
w3mには、複数のページを切り替えつつ見るためのコマンド (SELECT: バッファ選択モード)があります。
% w3m http://www.linuxjapan.com/ http://www.debian.org/
としてw3mを起動した後、sを押すとバッファ選択画面が出ます。
写真18: w3m-select.tiff w3mのバッファ選択画面
ここでは、w3mの外部ブラウザにScreenを登録することで、 w3mをタブブラウザ風に使う方法を解説します。
外部ブラウザは、コマンドライン引数で与えられたURLを処理できるもので あれば何でも使うことができます。呼び出し方法は、 w3mの(lynx風ではない)デフォルトのキーマップでは
となっています。<RETURN>は^Mでも入力可能ですから
といった風に覚えましょう。 外部ブラウザは3つまで登録できます。2番目の外部ブラウザを使いたいときは、 2M、2<ESC>M とします。
さて、以下のようなスクリプトを作って実行可能にしておきます。
#!/bin/sh screen w3m $@
名前はw3m-remote、としておきましょう。 これを、外部ブラウザの1番目に登録しておきます。 o でオプション設定パネルを表示させて(OPTIONS)、外部ブラウザに w3m-remoteのパスを記述しておきます。
写真19: w3m-remote.tiff w3mで外部ブラウザを登録している様子。
既に説明した通り、Screenのセッションの中でscreenを実行すると、 新しいウインドウを開いて指定されたコマンドを実行します。つまり w3m-remoteは、新しいウインドウを開いて、指定されたURLをw3mで 開くという動作をします。
このスクリプトを登録することで、
といったことが可能になります。
なお、普段は「q での終了時に確認する」をOnにしているけど、 w3m-remoteから起動されたw3mを終了させるときに いちいち確認されるのはうっとうしい、という場合は、 -o confirm_qq=0つきでw3mを起動するようにw3m-remoteを修正してください。
w3m-remoteと同様に、
#!/bin/sh screen wget $@
といったスクリプトを2番目の外部ブラウザに登録しておくと、
といったことが可能になります。wgetは裏で動いていますから ダウンロードが終わるのを待たずにw3mの操作を続けることができます。 wgetの代わりに後述のAriaを使うこともできます。
なお、私は3番目の外部ブラウザには
#!/bin/sh $HOME/bin/mozilla-remote -remote OpenURL\($@,new-window\)
といったスクリプトを登録しています。 mozilla-remoteについては <URL:http://home.netscape.com/newsref/std/x-remote.html>を 御覧ください *17。
写真20: w3mで見ているページをmozilla-remote経由で表示
私はSDL Watch<URL:http://www2.jan.ne.jp/~zinnia/sdl/watch.html>という、SDL関連の最新情報をお知らせするサイトを 管理しております。
メールやWebページからSDL Watchで使えそうなネタを探して、 (ほとんどがWebページの紹介)ひとことコメントを付け加えて それを紹介する…SDL Watchでやっていることは、 言ってしまえばこれだけのことなのですが(自虐的)、 そこで面倒になるのは「URLを自分の文書にひっぱってくる」作業です。
私の場合は、
という状態で作業をしていますが、 Screenのコピーアンドペーストを使うと、w3m側で現在見ている ページのURLをなんらかの方法で表示しておいて、それを コピーしてemacs側でペースト、とすることである程度は楽をすることができます。 たとえば、
Uのかわりにc(PEEK: 現在のURLを表示)を使うこともできますが、この場合 コピーモードに入った後に、URLの先頭までカーソルを持ってゆくのが 多少面倒になります。
Uにしてもcにしても、画面に入りきる程度の長さのURLであれば それでいいのですが、入りきらないほど長いURLでは、複数回に分けないと コピーできず不便です。
そこで「w3m側でURLをScreenのレジスタに送りつける方法」を考えてみます。 まずは^A?でヘルプを眺めます。普段使ってる^A[、^A]は、それぞれ copy、pasteというコマンドが割当てられていることが分かります。
マニュアルを読むと、pasteではキー(レジスタ名)を指定することができ、 それが省略されると「.」というキーが使われることが分かります。 copyコマンドで「.」という名前のレジスタに指定された範囲の文字列が 記憶されて、pasteでその中身が貼り付けられる、という流れです。
さらにマニュアルの中身を「register」で検索してゆくと、 レジスタに中身をセットするためのコマンドは、他にもreadreg、registerなどが あることが分かります。 前者はファイルの中身をレジスタに入れ、後者は指定された文字列を レジスタに入れることができるようです。
すでに説明したように、w3mには外部ブラウザを起動する機能があります。 引数にはURLを入れてくれますから、「外部ブラウザ」として、 registerコマンドをうまく発行できるような仕組があれば目的を 果たすことができそうです。
そこで役に立つのが、3.9.9からサポートされるようになった-X(コマンドライン) オプションです。 screenを-Xつきで呼び出すと、それに続く文字列がScreenのコマンドである として評価させることができます。
例えば、
screen -X register . "Linux Japan"
とすると、レジスタ「.」に「Linux Japan」という文字列が入ります。 ^A] と入力すると、「Linux Japan」という文字列がペーストされるはずです。
写真21: register-paste.tiff コマンドラインからレジスタに文字列を送った様子。 次の行でコマンドラインからペーストさせています。
そこで、w3m外部ブラウザとして以下のようなコマンドを登録します。
screen -X register .
リンクを M で辿ると、そのリンクのURLがScreenのレジスタに入ります。 また、<ESC>M で現在見ているページのURLがScreenのレジスタに入ります。
この方法を使うと、w3mで表示されているページのURLを emacs側にペーストするには、
というふうに簡略化されてとても快適です。
もちろん、最初から「URLをScreenのレジスタに送りつける」ための 機能をw3m側に実装して、専用のキーに割当てる、といったことも可能です。 しかし、w3m側でできること、Screen側でできること、を知ることで、 上で紹介したようにソースに手を加えるような大がかりな方法を とらなくても目的の機能は実現できるということが分かります。 *19
X上の端末で作業をしている場合は、何も狭い端末の中だけですべての 仕事をしようなどと考えることはありません。必要に応じて 端末の外で動くアプリケーションを使いましょう。 アプリケーションによっては、コマンドラインから指示を送ることが できるものがあります。
XMMS<URL:http://www.xmms.org/>では、
% xmms ファイル名
とすることでXMMSを起動して指定されたファイルの演奏を始めます。 このとき、設定→オプション(タブ)→複数のXMMSの起動を許可する のチェックを 外すと、すでにXMMSが起動している場合はそのXMMSに対して指示を送ることが できます。
写真22: XMMSで演奏するファイルをコマンドラインから指示
Aria<URL:http://aria.rednoah.com/> (ダウンロードツール)では、
% aria -g URL
で、ダウンロードするURLを送ることができます。
写真23: Ariaでダウンロードさせたいファイルをコマンドラインから指示
w3mの「外部ブラウザ」にAriaを登録すると、
といった利点があります。
本稿では詳しく触れることができなかった Screenの機能を簡単に紹介します。各機能の詳細は infoを御覧下さい。
hardcopy (^Ah または ^A^H *20 ) コマンドで、画面のハードコピーをとることができます。
ハードコピーの結果はhardcopy.N という名前(Nは数字)で、 Screenの起動したディレクトリにセーブされます。 セーブする場所を変えたいときはhardcopydirコマンドで指定してください。
log(^AH)コマンドでログをとる/とらないのトグルをします。 セッション全体でscript(1)と同様なログをとることができます。 ログはscreenlog.N という名前(Nは数字)でセーブされます。
Screenでは端末を複数の領域に分割し、それぞれに別々のウインドウを 表示させることができます。このとき、個々の領域をリージョンと呼びます。
リージョンの操作の一覧を以下に示します。
リージョンを2つに分割します。新しいリージョンには何もない ウインドウ(ウインドウ番号 - )が割当てられます。 Emacsのウインドウ操作における ^X^2に相当します。
別のリージョンにフォーカスを移します。directionには、 up(前)、down(次)、top(先頭)、bottom(末尾)を指定することができます。 省略するとdownが指定されたことになります(Emacsのウインドウ操作における ^Xoに相当)。
現在のリージョンを残して他をすべて閉じます。Emacsのウインドウ操作における ^X^1 に相当します。
現在のリージョンを閉じます。リージョンが1つの場合は何も起こりません。 Emacsのウインドウ操作における ^X0に相当します。
現在のリージョンのサイズを変更します。
Screenは、複数のユーザで1つのセッションを共有することができます。 これをマルチユーザモードといいます。
マルチユーザモードでは、ユーザごとに権限を設定したり、 使えるコマンドを制限したりすることができます。
マルチユーザモードを使うと、
などとすることで、発表者の操作を聴衆の目の前の端末に配信させる ことができます。
いくら「Screenは便利だ」といっても、そもそもコンソールと、 そこで動くアプリケーションを有効に活用してなければその「便利さ」を 充分に得ることはできません。しかし、本文中でも述べましたが、 コンソールだけで全ての作業をやるべきだとは私は考えていません。
コンソール上のアプリケーションと、Xのアプリケーションは排他的な 存在ではなく、それぞれに適した使いかたがあるはずです。 それを理解し、コンソールでできることを増やしておいて、 それをScreenの中で動かすようにする努力はとても有益だと思います。
Screenのセッションはリモートから接続しても軽快に動作します。 9600bpsのモデム経由でもしっかり動きます。
私は普段からノートパソコンを持ち歩いています。Screenの中で メールの読み書きやプログラミングなどを行っていますが、 近くにデスクトップマシンがあるときは、そこからノートパソコンに ログインしてScreenのセッションをいじっています。 私のノートパソコンは 大きめのキーボードとトラックボールつきで、個人的にはかなり 扱いやすいと思っていますが、それでもやはり 使い慣れたHHK Liteやホイールつきマウスにはかないません。
ところで、私がScreenの紹介を目的としたページ <URL:http://www2.jan.ne.jp/~zinnia/>を 公開したとき、周囲でScreenを使っているひとはほとんど見つかりませんでした。 当時の私はそのような「Screenの知名度、評価の低さ」を以下のように 分析しています。
今でもScreenのことを扱った文献やページはそれほど多くないような気がしますが、 本稿がScreenの知名度向上と、皆さんのScreen生活をより豊かにする きっかけになることを祈っております。
*1 端末の持つ、各種情報表示のために用意された行。
ktermでは、<CTRL> + 2ボタンで出てくる「VT Optionsメニュー」で、
「Enable Status Line」をチェックするか、リソースを
設定することで使えるようになります
*2 最新の動きなどはむしろ Freshmeat などから仕入れたほうがいいかもしれません。
*3Debian GNU/Linuxではtermcapではなくterminfoを
使っているためこの操作は必要ないようです。terminfoエントリを追加する
ためには、tic ./terminfo/screeninfo.srcとします。詳しくは
./terminfo/READMEを御覧下さい。
*4 なお、ここでインストールされた設定ファイルは、いくつかの
デフォルト動作を無効にする設定が入っています。そのため、
infoにあるキーバインドとは必ずしも一致しません
*5viだと<CTRL>+V <CTRL>+T、
emacsだと<CTRL>-Q <CTRL>-Tとすることで「^T」という文字そのものを
入力することができます。が、Screenに対する指示のときはそのような
ことをする必要がなく、単に「^」と「T」の二文字を入れればよいということです。
*6 私は^Tとしています。他には ^] などが好まれているようです。
*7./etc/etcscreenrc を見ると分かりますが、tsは
ステータスラインにカーソルを移動させるためのエントリ、
fsはステータスラインからカーソルを戻すためのエントリ、
dsはステータスラインの使用を停止するためのエントリです。
本文中の設定は、ステータスラインへの出入りを、
タイトルバー出力のエスケープシーケンスに置き換えることで
ステータスラインのかわりをさせています。
*8 Screenでは、端末が終了しても中のプログラムは終了させないのが
デフォルトの動作ですが(autodetach)、標準でない.screenrc(友達から
貰ってきた、など) を使っている場合は、内容を確認してから
この実験をしましょう。「autodetach off」という行があった場合は、
それを削除するか、「autodetach on」に変更してください。「autodetach off」の
状態でKTermを終了させると、中のプログラムも終了してしまいます。
*9 ^ZをPageUpのかわりにするのは
Emacs本来の動きとは違いますが...
*10 -Xオプションにおいてセッションを特定する場合は
-Sオプションが使えます。例: screen -S 418 -X prev
*11 「暗号化(crypted)」という表現が適切かどうか...
process.c 内のpass2()という関数でこの処理は行われています。
*12 自セッション内からでも拒否するようです...
*13 infoのKnown Bugsにも書かれていますが、なぜかscreen -d や
screen -D はそのまま通ります...
*14 同様に「ファイルの先頭の部分を表示する」ためのheadというコマンドも
あります。
*15headとtailを組み合わせると
「ファイルの任意の行から任意の行数だけ取り出す」ことができます。
またheadとtailは行単位だけではなく文字単位での指定もできます。
詳しくはマニュアルを見てください。
*16本文とは関係ないですが、私は在学当時aito先生(w3mの作者)の
授業とってました。
*17最近のMozillaで実装された「新しいタブで開く」(Open In New Tab)を
なんとかmozilla-remote から呼び出したいのですが
今のところうまくいっていません...
*18 フレームを使ったページでは必ずしもそうではないのが厳しいです
*19 なお、w3mでは外部ブラウザは3つまでしか登録できません。私は
すでに書いた通り3つとも登録してしまっておりますので、ソースを
いじって4つ目の外部ブラウザを登録できるようにしました。このくらいの
変更なら自分の責任でなんとかできる規模だと思います。
*20 インストール時のetc/screenrc ではこれらのバインドを無効にする
設定が入っています。そのためデフォルトでは使えませんのでご注意ください