記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索

    SCREEN

    2012年12月27日20:44tmux: 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



    このエントリーをはてなブックマークに追加
    2012年02月10日21:27tmuxをつかいはじめて一週間

    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をどうするか謎は深いなぁ。



    このエントリーをはてなブックマークに追加
    2011年05月23日18:47screen/tmuxのエスケープキーをどうするか問題

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



    このエントリーをはてなブックマークに追加
    2011年05月06日14:02screenx
    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の接続が切れるので、そこのところは要注意。
    


    このエントリーをはてなブックマークに追加
    2010年01月07日14:10X 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 "$@"
    


    このエントリーをはてなブックマークに追加