試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GNU screenの設定

設定ファイル

はじめは/etc/screenrc${HOME}/.screenrcとしてコピーして編集するのがよいかもしれない。
「autodetach on」など、既定値を書いているものは書いていないが、「startup_message off」など、環境によって必要なものは書いている。
ファイル名: ${HOME}/.screenrc

## 一部キー割り当てを変更
escape ^Tt             # 比較的無難(衝突自体は存在する)
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

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

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

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

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

# 例(1分ごとに更新の場合の設定)
#backtick 0 60 60 /home/xxx/bin/screen_cputemp.sh
#backtick 1 60 60 /home/xxx/bin/screen_hddtemp.sh

## 状態表示のカスタマイズ
# %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)
# %n: アクティブなウィンドウの番号
# %M: 月(1-12)
# %s: 秒
# %t: タイトル
# %-w: 現在アクティブなウィンドウ番号より小さいウィンドウの表示部分
# %+w: 現在アクティブなウィンドウ番号より大きいウィンドウの表示部分
# %w: 現在アクティブな番号/タイトルに「*」を付けた全ウィンドウリスト
# %y: 西暦年(2桁)
# %Y: 西暦年(4桁)

## 情報の表示

## X上の端末エミュレータ向け
## splitするとcaptionが複数箇所になってしまうが、
## 端末のウィンドウタイトルを変更できる
hardstatus string "[ SCREEN %n: %t ] %h"  # X端末のタイトルの最終的な出力
caption always "%{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d"
#caption always "%{=b b}[%0` %1`]%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d" # 温度表示のテスト

## ウィンドウタイトルの変更がされないが、一番下の行だけになる
#hardstatus alwayslastline "%{=b b}%-w%{=b rw}%n %t%{-}%+w %=%{=b g}%c:%s %Y/%m/%d"

スクリプトによる情報取得の例

screen_cputemp.shの例(k8tempの値を直接読んでいる例なので、読んでいる場所などは環境によって書き換える)

#! /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}"

screen_hddtemp.shの例(hddtempを使用)

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

(2009/1/20)ncというのは多くのディストリで「netcat」というパッケージにより提供されるコマンドで、ディストリによってはコマンド名はnetcatとなることがある。

このようなものが表示できるので、表示させたい情報を出力するようにスクリプトを書いて指定する。
(2009/1/20)この部分については後からの説明となってしまうが、一番下にステータス行(キャプションかハードステータス)を表示するようにしたとき、情報(文字列)を出力するスクリプトを用意して関連付けることで、外部コマンド/スクリプトを定期的に呼び出してステータス行の指定した場所へ出力・更新することができる。
このあたりは便利な機能ではあるのだが分かりにくい。以下の設定が必要となる。

  • ステータス行を使用する設定を記述
  • 実行されるスクリプトを準備
  • backtickの登録
  • キャプションかハードステータスの文字列中に、backtickのID番号を用いた「%[番号]`」の文字列を埋め込む

スクリプトの出力結果は1行のテキストで最後に改行を含むようにする(例:echoコマンド)。

現在実行中なコマンド名をタイトルとして表示する機能の注意点

shelltitle "$ |(シェルの入力待ちのときにタイトルとして表示する文字列)"

の「|」の左の部分は、プロンプトの一番最後の部分と合わせておく必要がある。

shelltitle "% |shell"
shelltitle "# |shell"

のように、使用しているプロンプトに合わせて修正しておく。
また、この機能では、コマンドの引数までは表示してくれないので、bashの設定に追記しておいた関数tとsを使用することで、最大2つまでの引数を付けてタイトルに反映できる。これらの関数は、bashだけでなく、zshでも使用できる。下は実行例。

$ t man 3 printf
$ s emerge -avuD world


使用したバージョン:

  • screen 4.0.3