Tmuxで監視ダッシュボードを(Tips備忘録)

# ある作業中の監視のために
ちょっとした作業だけど、一応リアルタイムでモニタリングしながら作業したい、というときがあります。
日常からきちんとしたモニタリングを用意してる環境ならいつも通りそれを眺めてればいいのですけれど、そういう性質の環境じゃなかったり、あるいはあまりやらない特殊作業の時など通常のモニタリング項目でフォローできない場合、手軽に取れる方法が欲しいものです。

モニタリング自体は使い捨てのスクリプトを組んでポーリングすればいいだけなのですけれど、大体そういう監視を平行でそれなりの数を実施しないといけません。
ぱっと思いつくのはTmuxでPaneを大量に並べてそれぞれでスクリプトを走らせる方法なのですが、、気の利いたことをしようとするとちとややこしいです。
そこらの周りで調べたり試したりしたことをまとめます。

# Tmux関連
## Paneレイアウトとサイズ
Tmux単騎だと、意図したレイアウトでPaneを並べるのは難しいです。
Tmuxinatorあたりを使うのが前提になるのですが、、それでも非常にめんどくさい。
一回Tmux起動して、split-paneで画面を割って、サイズを調整して、、最後にtmux list-windowsでlayoutをひろって、、、もいいのだけれど、表示したいPaneが１つ増えたらまたやり直し、、、
めんどい。。。

ざっと探した感じで、良さげなツールなどは見つけられませんでした。
ここは自作したほうが早いかな、、

## スクリプトが（異常）終了したときのPaneの扱い
tmuxinatorをつかっていれば勝手に解決してくれる問題ではあるのですが、一応。
tmuxのセッション起動時やsplit-paneで画面を割るときに、引数にコマンドを入れると、それを実行した状態でPaneを起動できます。
ということで、tmux split-pane XXXというのを鈴なりに書いたスクリプトを用意しておいて、tmux起動後にそれを呼び出せばうまいことダッシュボードが出来上がるか、と思ったのですが、問題が、、
この方法でコマンドを実行すると、そのコマンドが終了すると同時にPaneが閉じてしまいます。

こんな。

コマンド付きでpaneを割ってます。
右の窓で1秒ずつスリープしながら数字を表示しますが、、、
![2021-12-20_20:42:53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/9199f869-3c51-8fbd-66c1-625b3c6871bd.png)

はい。
処理が終わったら、Paneも自動で閉じてしまいます。
![2021-12-20_20:43:02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/38a12c2e-6508-7a56-5b81-11e9bd8c58f8.png)

Pane２枚ならそりゃ気がつけますが、１０も２０も表示してるなかで１つ２つ消えてもパット見で気がつかないですし、気がついてもどれが落ちたのかわかりません。。
これが監視スクリプトだったとして、想定外の異常終了だったとして、、そしてスクリプトが想定外の終了をしたということは何かトラブルが起こっている可能性が高いわけで、問題が起こってるのに気がつけない、という危険な状態が出来上がります。

スクリプト自体をしっかり作って、異常せずに赤文字でErrorと表示し続ける、みたいなしっかり目の実装しておけばいいのですが、それに頼るというのも怖いです。

Tmuxinatorを使えば、Paneでディフォルトのシェルを起動して、その上でコマンドをsendkeyで流し込むみたいな実装っぽいので、コマンドが終了しても元のシェルが生きているのでPaneは消えませんが、まぁ一応記憶の片隅においておくということで。

### 脱線　Paneを閉じなくできないの？
調査不足ならお恥ずかしいですが、オプションとかでそいうう振る舞いにする方法というのは見つけられませんでした。
。。あったらあったで「なんに使うんだ？」となる気もしますけど。

別の方法としては、Paneをシェルプロセスで立ち上げた後に、そのシェル上でコマンドをスクリプトを実行させるというのが思いつきます。
ただ、tmuxコマンドなどでPaneに対してかっこよくスクリプト実行コマンドを渡すという方法はなく、「キーボードでコマンドを１文字づつうっている」というような模擬操作で実装することになります。
。。。動かなくはないですけれど、カッコ良くはないなぁ、、
https://www.webdevqa.jp.net/ja/bash/%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AEtmux%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7tmux%E3%83%9A%E3%82%A4%E3%83%B3%E3%81%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%AF%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B/959243394/

tmuxinatorは裏でこれをやってくれているわけですね。
以下のような変換を内部で実施して、最終的に作ったスクリプトをキックしてくれるようです。

```
$ cat .tmuxinator.ymlname: test01
root: ~/
windows:
  - win01:
      panes:
        - top
```

```
#!/bin/bash

# Clear rbenv variables before starting tmux
unset RBENV_VERSION
unset RBENV_DIR

tmux start-server;

cd /home/user01

# Run on_project_start command.
  # Run pre command.
   
  # Run on_project_first_start command.
 
  # Create the session and the first window. Manually switch to root
  # directory if required to support tmux < 1.9
  TMUX= tmux new-session -d -s test01 -n editor
  tmux send-keys -t test01:0 cd\ /home/user01 C-m

  # Create other windows.

  # Window "win01"
  tmux send-keys -t test01:0.0 top C-m

  tmux select-layout -t test01:0 tiled

  tmux select-layout -t test01:0 
  tmux select-pane -t test01:0.0

  tmux select-window -t test01:0
  tmux select-pane -t test01:0.0

  if [ -z "$TMUX" ]; then
    tmux -u attach-session -t test01
  else
    tmux -u switch-client -t test01
  fi
```

。。。素直にtmuxinatorを使わせていただきましょう。。

# Script関連
## パット見で正常・異常がわかるスクリプト
やはり、色でしょうか。
Bashでも、echoする際にエスケープシーケンスをつけるだけで、パット見で状況を把握できるようになります。

![2021-12-20_23:48:55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/f9b1f892-d920-12d6-d87c-955e4ad080c8.png)

で、これを数秒置きに表示させれば監視ができるのですが、、、、これも、途中で異常終了したときに結構困ります。
”OK"が縦いっぱいに表示されていると、表示が更新されているんだかどうなんだかわからなくなるんですよね。。
例えば。

![2021-12-20_23:52:00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/9bb09304-36fa-3ed7-19f2-551a2c7bf0ec.png)

一番下の行を見るとプロンプトに戻っていて、スクリプトは終了しちゃっているのですけど、緑OKが立ち並ぶコンソールを眺めて目が慣れてきてしまっていると気がつけず、OKが続いていると思い込んでしまいます。。

行が更新されていることにパット気がつけるようにというと、こんな感じでしょうか。
なんかクリスマスツリーみたいですけど。

![2021-12-21_00:09:54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587269/5c7d6c78-38cd-e4b5-b56f-d76379fb5ebc.png)

こうしておけば、行が動いてるかどうかが一目瞭然でわかります。
タイムスタンプ表示してもいいのですけど、作業長引いて目がつかれてくると結構見落としたりするので、こんくらいわかりやすい位がありがたいかなと。
この例は流石になんともなので、時間があればもうちょっとかっこよくしたいですが、、

## 色付きGREP
シスログ流しっぱにして、想定のログが出るかどうかを見たい、というときもあります。
そういうときはこれでしょうか。

```
$ tail -f /var/log/syslog | GREP_COLOR='01:31' egrep --line-buffered --color "$|<keyword>"
```

該当キーワードに色を付けつつ、それ以外の行もフィルタせずに表示します。
キーワードだけ追いかけているとそれ以外のエラーや想定外の動きを見落とすので、一応それ以外も表示するケースです。
逆に色がついている行がすぐに流れて見づらいだけかもしれませんが。

# 一旦まとめ
Tmuxで監視スクリプトを大量に走らせて、パット見て状況把握でいるダッシュボードを作ろうという話の、Tipsいろいろでした。
Tmuxinator（というかTmux）のレイアウトが自動生成できないのは面倒なので、そこは生成できるスクリプトを作ってみようかなと思います。
チェックサムがついていたりと面倒なのですが、チェックサムの計算方法はtmuxのコードみてたら見っけましたし、構文もなんとなく理解できたので。

今日はこんなところで。


#