rcmdnk's blog

SCREEN(スクリーン) 2016年 11 月号 [雑誌]

GNU screenは何と言っても一度ターミナルを落としたりsshが切れたりしても 再度ログインした時に同じ状態に戻せるのが便利なところですが、 たまにちょっとした作業をして残っているセッションがあるにも関わらず 新たにセッションを立ち上げてしまうことがあります。

そんな二重起動を防ぐスクリプトについて。

Sponsored Links

GNU screenの二重起動防止スクリプト

以下の様なスクリプトを.bashrc等の設定スクリプトの中でsourceするなり 直接設定スクリプトの中に書くなりします。

screenと言うラッパー関数を作って本来のscreenコマンドの代わりに これが呼ばれる様になります。

セッションが一つだけ存在する場合は

$ screen -d -r

します。現在Attachされていても他のターミナルでのセッションを落として 新たに繋げる様に。

もし2つ以上のセッションが存在する場合は存在するなかから 選択して繋げる様にします。

sentakuがインストールされていればsentakuで、 なければ適当なプロンプト選択画面を出して選択出来る様にしています。

pecoとかを使っているなら コマンドチェック部のtype -a sentakutype -a pecoにして sentaku -s $'\n'の所をpecoにしてあげればOK。

何らかの引数を与えた時にはこれらの動作は無しにして本来のscreenに直接 引数を渡して起動する様にもしています。

すでにセッションがある時にも新たにセッションを作りたいときも当然あるので、 その様な時は-nを渡すと直接screenコマンドを打って新しいセッションが 始められる様にしてあります。 (GNU screenでは-nは今のところ使われていないのでこれにしています。)

screen.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function screen () { # Screen wrapper {{{
  local options=""
  if [ $# = 0 ];then
    sockets=$(command screen -ls|grep -e Attached -e Detached)
    n_sockets=$(printf "$sockets"|grep -c '')
    if [ $n_sockets -ge 1 ];then
      if [ $n_sockets -eq 1 ];then
        options="-d -r"
      else
        if type -a sentaku >& /dev/null;then
          session=$(echo "$sockets"|sentaku -s $'\n'|awk '{print $1}'|cut -d'.' -f1)
          if [ "$session" = "" ];then
            return
          fi
        else
          n=1
          while read -r s;do
            printf "%-2s %s\n" "$n" "$s"
            ((n++))
          done < <(echo "$sockets")
          printf "\nChoose session: "
          read i
          if ! expr "$i" : '[0-9]*' >/dev/null || [ "$i" -ge "$n" ];then
            return
          fi
          session=$(echo "$sockets"|sed -n "${i},${i}p"|awk '{print $1}'|cut -d'.' -f1)
        fi
        options="-d -r $session"
      fi
    fi
  fi
  if [ "$1" == "-n" ];then
    shift
  fi
  options="$* $options"

  command screen $options
}
Sponsored Links
Sponsored Links