screen - 仮想端末


Table of Contents

概要 Edit

screen コマンドで、ひとつの端末で複数の仮想端末を使用することができます。 簡単切り替えができて、ひとつのターミナルで全てができるようになります。

% screen 

として仮想端末を生成します。^A-c で仮想端末を生成、^A-p, ^A-n で移動することができます。

設定ファイルは.screenrcの項を参照してください。

おすすめ参考サイト:Let's use SCREEN!

利点 Edit

以下のような利点があります。

  • ひとつの端末で複数の仮想端末を使用することができる
  • 2ストロークで仮想端末の切り替え、増減ができる
  • 画面上をキーカーソル移動できる(通常は現在プロンプトだけ)
  • これにより、画面上の文字をマウスを使わずにコピーアンドペーストできる
  • screen の環境を丸々保存(detach 切断)、後日復帰(resume or attach 再接続)出来る。何かのファイルを開いたままの状態で保存しておいたりできるため、ただのシェルの history に比べ優れる(ただし nohup しても文句を言われない環境が必要)
  • 複数の端末でひとつの画面を操作できる(共有)。

最近は高機能な端末エミュレータが存在し、画面上をキーカーソル移動できたり、「タブ」という形で複数の仮想端末を生成、操作できたりもしますが、detach, attach の機能は screen ならではと言えるでしょう。 また、多くの場合、それらの高機能端末エミュレータはリッチなローカルホスト環境でのみ利用可能なため、サーバにリモートログインするような場合、リモートログイン先での screen 起動は必須となるでしょう。

s1138001

欠点 Edit

以下のような欠点があります。

画面上をキーカーソル移動する機能 ^A-[ でスクロールアップすることになります。./screenrc に

termcapinfo * ti@:te@

を書いておくことでスクロールバーを使用することもできますが、全ての画面でスクロール上部を共有しはじめるため、どの画面を開いているのかわかりにくくなり、混乱の元となります。

※これは screen というソフトが端末テキストの書き換えにより実現されている以上、なんともしようがないように思えます。

操作 Edit

デフォルトではすべて ^A (^ は Ctrl キーのこと)で始まりますが、これは .screenrc で設定することも出来ます。

基本 Edit

基本的な操作としては以下のようなものがあります。

^A-c画面(端末)の新規生成
^A-p前の画面に移動
^A-n次の画面に移動
^A-^A直前作業していた画面に戻る
^A-[0-9](^A-数字)数字の画面に移動
^A-w画面の一覧の表示
^A-k現在の画面の起動プロセスを終了. exit でも可
^A-?簡略キーバインド一覧

コピー&ペースト Edit

^A-[コピーモード(画面上のキーカーソル移動)開始。viと同じキーマップでカーソル移動、Enter2回で指定範囲をコピー
^A-]コピーしたテキストを張り付け

画面分割 Edit

^A-S画面を分割する。^A-<TAB> で移動し、^A-c で画面を作成する
^A-Q現在の画面を残して、画面分割を閉じる
^A-<TAB>分割した次の画面へ移動する

デタッチとアタッチ Edit

^A-dデタッチ。screen セッション(全体)を保存し、screen を起動する前のシェルに戻る。screen -ls でデタッチ中のスクリーンを確認できる。screen 中で実行されたプロセスはバックグラウンドnohup 状態で動作し続ける。デタッチは nohup に比べプロセスを起動してしまった後でも nohup 状態にできるためありがたい。会津大学ではところ構わず nohup されると迷惑。
screen -r [pid]リジューム or アタッチ。デタッチした screen セッションの復帰。pid ことプロセス番号は screen -ls でも ps でも確認できる。pid はデタッチした screen セッションが1つならば省略も可能。
screen -xマルチアタッチ。既に開かれているセッションにアタッチすることができる。ローカルホスト自身で screen セッションを開き、他のコンピュータからそのホストにアクセス、screen -x することで、同じ画面を2つのコンピュータで共有したりできる。

シェル起動時自動起動 Edit

.bashrc もしくは .zshrc 用。シェル起動時に screen を自動起動する。

if [ $SHLVL = 1 ];then
  screen
fi

if [ $TERM != 'screen']; でもいいだろう。

もしくは、

screen -xR

と書いておく。すでに screen セッションがある場合そこに接続し、なければ作成する。 つまりこの場合、新しいシェルと以前から起動していたシェルでただ一つの screen セッションを共有する。

参照 Edit


xrea