×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

GNU screen

GNU screenについて

(1つの仮想)端末の中で更に複数の仮想端末(ウィンドウと呼ぶ)を作って管理できるソフトウェア。

X Window System上の端末ソフトウェアとは多少性質が異なる。

機能/利点

  • ウィンドウを切り替え可能で、1つのウィンドウを分割して同時に複数のウィンドウを表示することもできる

  • ウィンドウの上のほうに流れてしまった出力をさかのぼって(後方)スクロールできる

  • ウィンドウ内の文字列をコピペできる

  • 日付/時刻やウィンドウ一覧、更に任意の出力を常に表示することができる(要設定)

  • ウィンドウ内の出力をファイルに書き出せる

  • 複数の異なる端末から同一の画面を操作でき、セッションのアクセス権を(遠隔からは読み取り専用になるよう)設定し、相手に遠隔ログイン後接続してもらうことで、コマンド操作などを相手に見せる教育的用途にも使える(http://sourceforge.jp/magazine/06/09/11/088249などを参照)

欠点

  • 高機能故にとっつきにくく、manページも難解で、詳しく解説されていない部分もある

  • GNU screen固有の様々な操作はコマンドキーというキー(任意のキーに設定可)を用い、これに続いて操作ごとに別のキーを押すという2段階のキー入力で、慣れるまではつらく、面倒に感じるかもしれない

  • コマンドキーの割り当てによってはシェルやエディタの操作とかぶってしまい、その操作ができなくなる

GNU screenの実行例

例127 GNU screenの実行例

$ screen -UxR

上のオプション指定による動作

  • 一度切断されたセッションがあれば再接続

  • 接続されているセッションが既にある場合もそれに接続(マルチセッションモード)

  • セッションが存在しなければ新しく作成/接続

  • UTF-8モード

記事リンク

GNU screenの既定のキー割り当て(一部)

[注意]注意

以下のキー割り当てについて、アルファベットの大文字と小文字は区別される。また、各割り当ては設定ファイル[ホームディレクトリ]/.screenrcにて変更可能

キー割り当てのヘルプ

Command ?を押すとキー割り当て一覧がウィンドウに表示される。SPACEで2ページ目に移動、Enterで終了。

ウィンドウ(仮想端末)制御のキー操作

表70 ウィンドウ制御のキー操作

機能キー
作成(screen)Command cもしくはCommand Ctrl+c
次の番号(next)Command nもしくはCommand Ctrl+n
前の番号(prev)Command pもしくはCommand Ctrl+p
前に表示していた仮想端末(other)Command Command
リストから選択(windowlist -b)Command"

後方スクロールとコピペに関する操作

後方スクロールとコピペは共通のコピー/スクロールバックモードにて行う。

表71 コピー/貼り付け/後方スクロール機能のキー操作

機能キー
コピー/スクロールバックモードに入る(copy)Command [
コピー始点でEnter、終点に移動後Enter
貼り付け(paste)Command ]

画面の分割に関する操作

表72 画面分割のキー操作

機能キー
分割(split)Command S
現在操作している領域以外を隠す(only)Command Q
現在操作している領域を隠す(remove)Command X
操作する仮想端末の切り替え(focus)Command Ctrl+i/Command Tab

GNU screenの設定

GNU screenの設定ファイル

表73 GNU screenの設定ファイル

ファイル説明
/etc/screenrcシステム設定/一般ユーザは変更不可
[ホームディレクトリ]/.screenrc一般ユーザ向け設定

はじめは/etc/screenrc[ホームディレクトリ]/.screenrcとしてコピーし、必要に応じていじっていくのがおすすめ。

GNU screenの設定例

例128 GNU screenの設定例

# GNU screenの設定ファイル
# 20090918

# 256色拡張
# (frexx.de/xterm-256-notes/ の設定を改良したもの)
attrcolor b ".I"
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm:hs:ts=\E]0;:fs=\007:ds=\E]0;\007'
termcapinfo rxvt-256color 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm:hs:ts=\E]0;:fs=\007:ds=\E]0;\007'
defbce "on"

## cjkwidth(パッチ済みバージョンのみ)
cjkwidth on

## 一部キー割り当てを変更
escape ^Tt             # 比較的無難?(Emacsなど、衝突自体は存在する)
bind ^W windowlist -b  # リストから選択してEnterで切替
bind ^Q quit           # 確認の後、全て終了

## Emacs風ウィンドウ管理
bind 1 only     #  C-x 1
bind 2 split    #  C-x 2
bind 0 remove   #  C-x 0
bind o focus    #  C-x o

## 一発切替(あまり使っていない)
#bindkey -k k1 select 0
#bindkey -k k2 select 1
#bindkey -k k3 select 2
#bindkey -k k4 select 3
#bindkey -k k5 select 4
#bindkey -k k6 select 5
#bindkey -k k7 select 6
#bindkey -k k8 select 7
#bindkey -k k9 select 8
#bindkey -k k; select 9
#bindkey -k F1 select 10
#bindkey -k F2 select 11


# 既定値なので書く必要のないもの
#autodetach on				# 既定値: on
#crlf off				# 既定値: off

## 新規ウィンドウに対しての後方スクロールの長さ Gentoo Linuxでは1000
defscrollback 1000			# 既定値: 100

## 起動時のメッセージを表示しない(Gentoo Linuxではoff)
startup_message off

## シェルのウィンドウタイトル(好みで変更)
#shelltitle "$ |$SHELL"
#shelltitle "$ |sh"
shelltitle "$ |*"

## 情報収集スクリプトからデータを読み込んで表示
# backtick [id] [lifespan] [autorefresh] [cmd] [args...]

# 例(1分ごとに更新の場合の設定)
#backtick 0 60 60 [screen_cputemp.shの絶対パス]
#backtick 1 60 60 [screen_hddtemp.shの絶対パス]
#backtick 2 2 2 [screen_cpufreq.plの絶対パス]

## 状態表示のカスタマイズ
# %0`, %1`, ...: backtickのidによる出力
# %{=b cw}: ANSIエスケープコードによる書式設定例(太字 シアンの背景に白文字)
#           %{b c}のように片方の指定では前景色として指定される
#           blac[k] [r]ed [g]reen [y]ellow [b]lue [m]agenta [c]yan [w]hite
# %{-}, %{--}: 書式解除
# %a: am/pm
# %A: AM/PM
# %c: 24h表記の時・分
# %C: 12h表記の時・分
# %d: 月の中の日
# %h: X端末のウィンドウタイトル(シェルからの出力部分)
# %H: ホスト名
# %l: system load
# %m: 月(01-12)
# %M: 月(1-12)
# %n: アクティブなウィンドウの番号
# %s: 秒
# %t: タイトル
# %-w: 現在アクティブなウィンドウ番号より小さいウィンドウの表示部分
# %+w: 現在アクティブなウィンドウ番号より大きいウィンドウの表示部分
# %w: 現在アクティブな番号/タイトルに「*」を付けた全ウィンドウリスト
# %y: 西暦年(2桁)
# %Y: 西暦年(4桁)

#caption always "%%-w:[%-w] %%n:[%n] %%t:[%t] %%+w:[%+w] %%w:[%w]" # テスト用

## 情報の表示

## X端末のタイトルを動的に変更
## captionを使用すると分割したときに2箇所に表示される
hardstatus string "[ SCREEN %n: %t ] %h"
#caption always "%{=b y}%m/%d %c%{--} %{=b c}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%1`"
caption always "%{=b y}%m/%d %c%{--} %{=b c}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%h"
###caption always "%{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c %Y/%m/%d"
###caption always "%{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d"

#caption always "%{=b b}%-w%{=b rw}%n %t%{-}%+w %1`"
#caption always "%{=b b}[%0` %1`]%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d" # 温度表示のテスト
#caption always "%{=b y}%2` %{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d" # cpufreq


## X端末タイトルの動的変更がされないが、一番下の行だけになる
#hardstatus alwayslastline "%{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d"
#hardstatus alwayslastline "%{=b b}[%0` %1`]%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d" # 温度表示のテスト
#hardstatus alwayslastline "%{=b y}%2` %{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d" # cpufreq

GNU screenのキー割り当て

キー割り当ての設定はbindbindkeyで設定する。マニュアルページが詳しい。

backtick

定期的に外部コマンド/スクリプトを実行し、その出力を別途設定した最下行(キャプションかハードステータス)への出力の一部として表示する仕組み。

backtick [id] [lifespan] [autorefresh] [cmd] [args...]

外部コマンドの出力結果をキャプション/ハードステータス文字列へ「%[ID番号]`」として記述するとそこにコマンド出力が表示される。

下の各スクリプトを用いるための[ホームディレクトリ]/.screenrcの設定はGNU screenの設定例の中にコメントされた状態で含まれる。

例129 CPU(k8temp)/HDD(hddtemp)温度/cpufreqの状態を監視して出力する例

下の/sys/bus/pci/drivers/以下は各システムに合わせる。

[任意]ファイル名: screen_cputemp.sh

#! /bin/sh
cputempsrc=/sys/bus/pci/drivers/k8temp/0000:00:18.3/temp1_input
cputemp=$(cut -c 1-2 $cputempsrc).$(cut -c 3- $cputempsrc | sed -e s/00$//)
echo "CPU:${cputemp}"

下のスクリプトはhddtempをデーモンとして動かした上でnetcatを別途インストールして使用する。netcatにはバックドア機能付きのバージョンもあるため、OpenBSD版を推奨。

[任意]ファイル名: screen_hddtemp.sh

#! /bin/sh
echo "HDD:$(nc 127.0.0.1 7634 | awk -FÂ¥| '{printf $4}')"

下のスクリプトは0番のCPUのみが対象。

[任意]ファイル名: screen_cpufreq.pl

#! /usr/bin/perl -w
use strict;
open F, "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq";
my ${FREQ} = <F>;
close F;
open G, "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor";
my ${GOV} = <G>;
close G;
${FREQ} =~ s/000\n//;  # MHz単位
# ${GOV} =~ tr/a-z/A-Z/;  # 大文字にする場合
printf "%s/%s\n", ${FREQ}, substr ${GOV}, 0, 3;  # 出力は好みで

GNU screenにおけるウィンドウ(仮想端末)とX端末のタイトル

各ウィンドウ(仮想端末)はタイトル文字列[59]を個別に設定できるが、以下の設定により、実行コマンドによって自動的にタイトルが変わるようになる。

shelltitle "[シェルのプロンプトの最後]|[シェル上の入力待ち状態のタイトル]"

例130 ウィンドウ(仮想端末)とX端末の自動タイトル変更を行うための設定例

ファイル名: ~/.screenrc

shelltitle "$ | shell"

ファイル名: ~/.bashrc

## 端末のタイトル
case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|mlterm|gnome*)
    PROMPT_COMMAND='\
echo -ne "\e]0;${PWD/${HOME}/~} - ${USER}@${HOSTNAME%%.*}\007"'
    ;;
  screen*)
    PROMPT_COMMAND='\
echo -ne "\ek\e\\"; echo -ne "\e_${PWD/${HOME}/~} - ${USER}@${HOSTNAME%%.*}\e\\"'
    unalias s
    # 使用法「t [command] [args...]」2つまで引数を含めてscreenのタイトルに反映
    function t ()
    {
      echo -ne "\ek$1${2+ $2}${3+ $3}\e\\"
      "$@"
    }
    # tと同様・sudoの短縮も兼ねる
    function s ()
    {
      echo -ne "\eks:$1${2+ $2}${3+ $3}\e\\"
      sudo "$@"
    }
    ;;
esac

(別途変数PS1に「$ 」で終わる文字列を代入しておく)

ファイル名: ~/${ZDOTDIR}/.zshrc

## 端末のタイトル
case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|mlterm|gnome*)
    precmd () { print -Pn '\e]2; %~ - %n@%m\a' }
    ;;
  screen*)
    precmd () { echo -ne "\ek\e\\"; print -Pn "\e]0; %~ - %n@%m\a" }
    unalias s
    function t ()
    {
      echo -ne "\ek$1${2+ $2}${3+ $3}\e\\"
      "$@"
    }
    # tと同様・sudoの短縮も兼ねる
    function s ()
    {
      echo -ne "\eks:$1${2+ $2}${3+ $3}\e\\"
      sudo "$@"
    }
    alias man='t man'
    ;;
esac

(別途変数PS1に「$ 」で終わる文字列を代入しておく)

X端末のタイトルは上の設定に加え、GNU screenの設定例のようにhardstatus string%hを含め、更に適切なtermcapinfo行を設定すると動的に変更されるようになり、書式はシェル初期化ファイル側のprecmdの中の出力で調整する。

記事リンク



[59] キャプション/ハードステータスで一覧を表示する設定にした場合やwindowlist -bの操作を行ったときなどに参照できる