SCREEN

tmux: grouped session

grouped sessionをつかうとscreenでのattachとおなじように、カレント・ウィンドウを独立に切り替えらえるようになる。

それでもscreenとはちがって

  • screenは端末ごとにウィンドウのレイアウトを変えられるが、tmuxはpaneの配置は共有される。
  • tmuxのウィンドウサイズは一番小さな端末の画面サイズになる。screenは fit コマンドをつかえば任意の端末の画面サイズに合わせられる。

grouped sessionのつかいかた

まずは端末エミュレータを2枚ひらく。

1枚目でtmuxコマンドを実行してセッションをつくる。ついでに C-b c でウィンドウをもうひとつ作っておく。

tmux lsを実行するとセッションの一覧がでてくる。こんなかんじ。左端がセッション名になる。

% tmux ls
0: 2 windows (created Thu Dec 27 19:00:07 2012) [80x23] (attached)
%

つづけて2枚目で tmux new-session -s hoge -t 0 を実行すると

一見 tmux attach した場合と同じようにみえる。

でも current window を独立に切り替えられるところが違う。

% tmux ls
0: 2 windows (created Thu Dec 27 19:00:07 2012) [80x23] (group 0) (attached)
hoge: 2 windows (created Thu Dec 27 19:02:38 2012) [80x23] (group 0) (attached)
%

2枚目で起動したtmuxセッションを終わるときは tmux kill-session を実行する。

detachしただけだとセッションが残ってしまうことに注意。

あと、tmux set -g aggressive-resize on を設定しておくのが吉。

koie

tmuxをつかいはじめて一週間

emacs23になってからMewでスパムが表示されると頻繁に画面制御がおかしくなって端末をresetしないといけない状態がずっと続いていたが、tmuxにしたらなかなか耐えてくれるようなのでおもいきって乗り換えてみた。左右分割したときにスクロールが速いというのも気にいっているところ。

screexをtmuxに移植してtmuxnというをつくった。screenはセッション毎にサーバがあるけどtmuxは複数のセッションを1つのサーバでまかなうので、tmuxn用のセッションを特別につくるようにしたり、サーバを起動したときの環境変数を中のシェルまでもってくるのでtmuxサーバを起動するときに環境変数をクリアしたり、tmuxがattachするときにクライアントの環境変数をセッションにコピーする機能を殺したり、こまごました違いがあって安定して動くまで時間がかかった。

tmux自体の動きでいちばんこまったのはC-hがDELに変換されてしまうというもの。ふだんバックスペースCtrl+Hで入力していて、それにあわせてemacsも設定してあってDELはC-dにしてある(bobcat仕様)なので、これはなんとかする必要があった。

ググっているとstty eraseを変更するとよいというブログがみつかり、さっそくソースコード調査。

  • sttyコマンドのソースコードでeraseを検索するとVERASEというシンボルで参照されるようだ。
  • tmuxのソースコードでVERASEを検索するとtty-keys.cに、とってもあやしいコードを発見。
 /*
  * Check for backspace key using termios VERASE - the terminfo
  * kbs entry is extremely unreliable, so cannot be safely
  * used. termios should have a better idea.
  */
 bspace = tty->tio.c_cc[VERASE];
 if (bspace != _POSIX_VDISABLE && key == bspace)
         key = KEYC_BSPACE;

svn annotateで調べるとr1417ではいったようだ:

------------------------------------------------------------------------
r1417 | tcunha | 2009-07-29 07:37:02 +0900 (Wed, 29 Jul 2009) | 7 lines

Sync OpenBSD patchset 184:

Detect backspace by looking at termios VERASE and translate it into \177
(which matches screen's behaviour if not its termcap/terminfo entry). The
terminfo kbs cap is often wrong or missing so it can't be used, and just
assuming \177 may be wrong.

------------------------------------------------------------------------

ソースコードのコメントをみてもコミットログをみても、どういう意図があるのかわからん。

とりあえずFreeBSDにはeraseのほかにerase2というのもあるので

stty erase ^?
stty erase2 ^h

という設定で逃げられたが、Linuxにはerase2はないようなのでそっち方面の人はどうすんだろう。

そのほかtmuxで気になること:

  • set-environment -uのつかいかたがわからない
  • paneをリサイズしたときに行を再配置してくれない。これはscreenだと折り返し位置を画面幅にあわせてくれるがtmuxはなにもしてくれない。
  • screenだと長い行を折り返して表示するかどうかを切り替えられる。横に長いログがでるときにwrapしない表示は便利だったんだが。
  • 別々のwindowにあるpaneを1つのwindowに集約して表示する方法がない。screenだとwindow分割してそこに別のwindowをもってくるようなこと。

screenとtmuxではモデルがちがって特にwindowの意味がちがっているので分かるまでかなり時間がかかった。

SCREEN

        1  n (screen -xのときn>1)
session ---- client
  |m          |1
  |           |
  |n          |1
window ----- layout (これが1画面)
  |1   n   1
  |
  |1
 pty

TMUX

        1  n
session ---- client
  |m (m>1になるのはlink-windowしたときだけ)
  |
  |n
window (これが1画面。誰から見てもおなじレイアウト)
  |1
  |
  |n
 pane (これが分割されたあとの区画に対応)
  |1
  |
  |1
 pty

(2012-02-23)

FreeBSD:/usr/ports/sysutils/tmux/files/ extra-patch-tty-keys.cにC-hをDELに変えるコードをはずすパッチがはいってた。backspaceとDeleteをどうするか謎は深いなぁ。

screen/tmuxのエスケープキーをどうするか問題

いちど2chでもりあがったよなぁとおもって探したらすぐにみつかった。

screenx

GNU screenはとっても便利だがX環境のことは考えられてないので
screenの中からXのアプリケーションを起動するときDISPLAY環境変数をどうするか
人間が与えてやらないといけない面倒くささがある。

これまではラッパースクリプトをつかって以下のように半自動化させていた。
0. DISPLAY環境変数が設定されてたら引数で与えられたプログラムをそのまま実行。
1. TCP 6000番から6020番までをポートスキャンして開いてるポートをさがす。
2. 複数のポートが開いていればリストして人間に決めさせる。
3. DISPLAY環境変数を設定して引数で与えられたプログラムを実行。

VNCをつかうという手もある。VNCをつかったときのメリットは
接続が切れてもXのアプリが死なないことと、
リモート接続の回線が細いときでもGUI操作ができることである。
(今の通信技術レベルだとWiMAXでつないでもXプロトコルが遅延に敏感すぎて使いものにならない。)
VNCをつかった場合の手順は以下のようになる。
0. VNCサーバを立ち上げる。vncserver :1
1. ~/.screenrcに setenv DISPLAY :1 と書いておく。
2. screenとは別にvncviewerも接続しておく。VNC用にsshのポートフォワーディングが必要かもしれない。

screenxはこれとは別のやりかたでscreenの中からXserverへ接続できるようにする。
0. screenの中ではDISPLAY環境変数はずっと同じ。デフォルトの設定では、あまり使われそうにない:99(port 6099)を利用する。
1. screen -rでアタッチする代りにscreenx -rを実行する。
   1.1 screenxはxauthコマンドをつかって外のDISPLAY環境変数に対応したエントリを:99にコピーする。
   1.2 screenxは外のDISPLAY環境変数をみてunix domain socketをつかうかtcp socketをつかうか判断する。
       1.2.1 unix domainならシンボリックリンクをはる。
       1.2.2 tcp socketならstoneをつかってポートフォワーディング用のデーモンを立ち上げる。
   1.3 screen -rを実行して本来のアタッチをする。
2. screenセッション内でXクライアントを実行するとDISPLAY=:99に接続しにいく。
   2.1 unix domainなら実際には外のDISPLAY(たとえばコンソールからxtermを起動しているなら:0)に接続していることになる。
   2.2 tcpならstoneが外のDISPLAY(たとえばsshをつかっていればlocalhost:11)に接続を転送する。

インストールは、まずstoneをインストールする。
デーモンモードを利用しているのでBSDの場合はMakefileにパッチが必要である。
それがおわったらscreenxを
hg clone https://koie@bitbucket.org/koie/screenx
からとってきてパスのとおったところに置いて、
~/.screenに次の2行を追加したら完了。
 setenv DISPLAY :99
 unsetenv WINDOWID

細い回線からXアプリをつかう場合にはvncviewerでリモート環境に接続して、その中でxtermを立ち上げscreenでアッタッチし、Xアプリを立ち上げればVNCの中でGUIの操作ができる。デタッチするとXの接続が切れるので、そこのところは要注意。

X application launcher in screen

screenのなかからXのアプリケーションを起動するときに
DISPLAY環境変数を設定するためのラッパを書いてつかっている。

#!/bin/sh
if [ -n "$DISPLAY" ]; then
    :
else
    LIST=$(
        nmap -sT -p6000-6020 localhost | awk '
        $2=="open" && $1~/^[1-9][0-9]*\/tcp/ {
            gsub(/\/tcp/, "", $1);
            printf(":%d\n", $1 - 6000);
        }'
    )

    i=1
    for disp in $LIST; do
        eval DISPLAY_$i=$disp
        i=$((i + 1))
    done

    tty=$(tty 2>/dev/null)
    echo "tty=$tty"
    if [ -n "$DISPLAY_2" -a -n "$tty" ]; then
        i=1
        for disp in $LIST; do
            printf "%2d %s\n" $i $disp
            i=$((i + 1))
        done
        printf "select DISPLAY: "
        read input
        eval val=\$DISPLAY_${input:-1}
        DISPLAY=${val:-$input}
    elif [ -n "$DISPLAY_1" ]; then
        DISPLAY=$DISPLAY_1
    else
        printf "input DISPLAY: "
        read DISPLAY
    fi
    echo "DISPLAY=$DISPLAY"
    export DISPLAY
fi
exec "$@"
記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    ギャラリー
    • 今日の練習 2018-11-13
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-10
    • 今日の練習 2018-11-10
    • 今日の練習 2018-11-10
    Amazon
    楽天市場
    adby google
    LINE読者登録QRコード
    LINE読者登録QRコード
    • ライブドアブログ