Ubuntu Weekly Recipe

第605回 Samplerでターミナルをダッシュボードにする

この記事を読むのに必要な時間:およそ 4 分

表示できるコンポーネント

Samplerでは前述の例にあるRunchartの他にも,以下のようなコンポーネントを表示できます。

Sparkline

Sparklineは値の変化を可視化することに特化した,小さな棒グラフです。ここではpsコマンドで全プロセスのCPU使用率を表示し,awkで加算した値を利用しています。

全プロセスのCPU使用率の合計を表示する例

sparklines:
  - title: CPU usage
    rate-ms: 200
    scale: 1
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'

図3 0.2秒ごとにCPU使用率の変化をプロットする

画像

Barchart

Barchartはいわゆる棒グラフです。Runchartと同様に,複数のアイテムを並べて比較するような用途に便利です。

Chromium,Firefox,Emacsそれぞれの使用メモリを表示する例。指定したプロセスが存在しない場合に値が返せずエラーとなってしまうため,本来であればプロセスが存在しなかった場合は0を返すようなラッパースクリプトを用意するのが望ましい

barcharts:
  - title: Memory usage by process
    rate-ms: 1000
    scale: 1
    items:
      - label: Chromium
        sample: ps ux | grep '[c]hromium-browser' | awk '{s+=$6} END {print s}'
      - label: Firefox
        sample: ps ux | grep '[f]irefox' | awk '{s+=$6} END {print s}'
      - label: Emacs
        sample: ps ux | grep '[e]macs' | awk '{s+=$6} END {print s}'

図4 Chromium,Firefox,Emacsそれぞれの使用メモリを表示した例

画像

Guage

Guageは最大値,最小値,現在値を指定することで,現在値が全体の何%にあたるのかを表示できます。たとえばディスクの空き容量や,プログレスバーなどでの利用が考えられます。

/と/homeのディスク使用量をグラフ化する例。最小値は0に決まっており,かつdfコマンドからは取得できない値のため,echoコマンドで0を出力している。sampleに設定するのは値ではなく実行するシェルコマンドのため,0とだけ書くことはできない

gauges:
  - title: Used Disk Space [/]
    rate-ms: 1000
    scale: 1
    percent-only: 5
    cur:
        sample: df / | tail -n 1 | awk '{print $3}'
    max:
        sample: df / | tail -n 1 | awk '{print $2}'
    min:
        sample: echo 0
  - title: Used Disk Space [/home]
    rate-ms: 1000
    scale: 1
    percent-only: true
    cur:
        sample: df /home | tail -n 1 | awk '{print $3}'
    max:
        sample: df /home | tail -n 1 | awk '{print $2}'
    min:
        sample: echo 0

図5 /と/homeのディスク使用量をグラフ化した例

画像

Textbox

Textboxはその名の通り,文字を表示するためのコンポーネントです。特定のコマンドの実行結果をそのまま表示したいような場合に有効です。

テキストで天気予報を表示できるwttr.inをcurlで叩いた結果と,おじさんがLINEやメールで送ってきそうな文を生成するojichatコマンドを埋め込んでみた例

textboxes:
  - title: Sapporo
    position: [[0, 0], [28, 10]]
    rate-ms: 10000
    sample: curl 'wttr.in/sapporo?0ATQF&lang=ja'
  - title: Tokyo
    position: [[29, 0], [28, 10]]
    rate-ms: 10000
    sample: curl 'wttr.in/tokyo?0ATQF&lang=ja'
  - title: Ojichat
    position: [[0, 11], [80, 13]]
    rate-ms: 5000
    sample: docker run --rm ojichat

図6 日本語や絵文字も表示できる

画像

Asciibox

AsciiboxもTextboxと同様に,コマンド実行結果の文字列を表示するコンポーネントです。Textboxとの違いは,文字をアスキーアートで表示する点です。ダッシュボード上で目立たせたい文字を表示する場合に便利ですが,アスキーアート化する都合上,日本語は表示できません。

現在時刻を表示する例。日本語を含んだ文字列は表示できないため,LANG=Cで実行している

asciiboxes:
  - title: Local time
    rate-ms: 1000
    font: 3d
    border: false
    sample: LANG=C date +%r

図7 現在時刻を3Dアスキーアートで表示した例

画像

レイアウトの調整

Samplerはターミナルのサイズや複数のコンポーネントの兼ね合いを考え,自動的にコンポーネントの位置とサイズを調整して表示します。しかし,せっかくですから自分好みにコンポーネントの位置やサイズを調整したいですよね。そのためにはコンフィグファイルにpositionを記載します。positionは以下の書式で指定します。

コンポーネントの位置とサイズを指定する書式

position: [[X座標, Y座標], [幅, 高さ]]

ターミナルの左上隅から,80x15の大きさでRunchartを表示する例

runcharts:
  - title: Load Average
    position: [[0, 0], [80, 15]]
    rate-ms: 200
    scale: 2
(...略...)

ですが,実際にターミナル上にコンポーネントを表示させながら,現物あわせで調整したい場合もあるでしょう。Samplerは実行中のコンポーネントの移動とリサイズに対応しています。

Samplerを実行している状態で,位置やサイズを変更したいコンポーネントをマウスでクリックして選択してください。その状態でEnterキーを押すと,⁠MOVE」⁠RESIZE」⁠RESUME」というメニューが表示されます。ここで「MOVE」もしくは「RESIZE」を選択すると,カーソルキーでコンポーネントを移動/リサイズできるようになります。好みの位置やサイズに調整ができたら,Enterキーで調整を終了します。この際,コンフィグファイルには自動的にpositionが追記されるため,次回起動時には同じレイアウトが再現されます。

ここで一点気をつけなければならないことがあります。コンポーネントの位置を調整してコンフィグファイルの上書きが発生した場合,コンフィグファイル内のコメント行がすべて消えてしまうという問題があります。一時的に設定をコメントアウトしているような場合にこれが発生すると,それらの設定は失われてしまうため気をつけてください。

このように,Samplerはターミナル上で任意の情報をメトリクス化することができます。様々なシェルコマンドと組み合わせて,君の考えた最強のダッシュボードを作ってみよう!

図8 紹介したコンポーネントを組み合わせてダッシュボードを作成してみた

画像

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。日本仮想化技術株式会社所属。