よんちゅBlog

― このブログは自分用のメモや日々の問題などを共有するためのものです ―

20121005185841 お知らせ:  2013/07/17 ブログデザインをリニューアルしました。

Macでtmuxのステータスラインに起動時間/ロードアベレージ/メモリ使用率を表示

タイトルの通り基本Mac限定です。
なぜかというと、メモリ使用率の取得に vm_stat (vmstatじゃないよ)というコマンドを使用しているからです。
vmstatはLinux系では有名なコマンドですが、残念ながらMacにはないんですよね。
Macのvm_statは名前は似ているけど表示される内容は随分違います。
あとメモリ使用率を調べるコマンドといえば free ですが、これもMacにはないですしね。

では前置きはこれくらいにして、どんな感じになるのかをどうぞ

一応説明すると、左から、LANG、起動時間、ロードアベレージ、メモリ使用率、現在時刻が表示されています。
起動時間が1日以上になるとこんな感じになります。

っで肝心の方法ですが、tmuxのステータスラインから自分で作成したスクリプトを実行するという方法です。
ですので以下の3つのスクリプトをPATHの通った場所に置いて、実行権限を付与して下さい。

起動時間

pc-running-time

#!/bin/sh
uptime | sed -e 's/.* up *\(.*\)/\1/' -e 's/\(.*\),.* user.*/\1/' | awk -F, '{print $1 $2}' | tr -s ' '

ロードアベレージ

loadaverage

#!/bin/sh
uptime | awk -F\  '{print $(NF - 2),$(NF - 1),$NF}'

メモリ使用率

追記: 2013/02/01
改良版を作成しましたので以下をご使用下さい。


これはちょっと長いです。
デバッグ用の関数などは不要なら削除して下さい。

used-mem

#!/bin/sh

## debug mode
#DEBUG="yes"
if [ "$DEBUG" = "yes" ]; then
    set -x
fi

## vm_stat コマンドのチェック
if ! type vm_stat > /dev/null 2>&1; then
    exit 1
fi

#
# メモリ使用率(%)を求める
#   精度は小数点第1位までとする
#
calculate_used_mem() {
    # vm_stat
    #  page size of 4096 bytes
    VM_STAT=$(vm_stat)
    PAGES_FREE=$(echo "$VM_STAT" | awk '/Pages free/ {print $3}' | tr -d '.')
    PAGES_ACTIVE=$(echo "$VM_STAT" | awk '/Pages active/ {print $3}' | tr -d '.')
    PAGES_INACTIVE=$(echo "$VM_STAT" | awk '/Pages inactive/ {print $3}' | tr -d '.')
    PAGES_SPECULATIVE=$(echo "$VM_STAT" | awk '/Pages speculative/ {print $3}' | tr -d '.')
    PAGES_WIRED=$(echo "$VM_STAT" | awk '/Pages wired down/ {print $4}' | tr -d '.')

    # 空きメモリ
    FREE_MEM=$(($PAGES_FREE + $PAGES_SPECULATIVE))

    # 使用中メモリ
    USED_MEM=$(($PAGES_ACTIVE + $PAGES_INACTIVE + $PAGES_WIRED))

    # 合計
    TOTAL_MEM=$(($FREE_MEM + $USED_MEM))


    # 使用中メモリ(%)
    #  小数点第1位まで求めて後から小数点文字(ドット)を挿入
    USED_MEM_PERCENT=$(echo "$(($USED_MEM * 1000 / $TOTAL_MEM))" | sed -e 's/\(.*\)\([0-9]\)/\1.\2/' -e 's/^\./0./')
    echo "${USED_MEM_PERCENT}"

    # RET
    return 0
}

# Debug
debug() {
    if [ "$DEBUG" = "yes" ]; then
        echo "PAGES_FREE: $PAGES_FREE pages"
        echo "PAGES_FREE: $(($PAGES_FREE * 4096 / 1024 / 1024 )) MB"
        echo "PAGES_ACTIVE: $PAGES_ACTIVE pages"
        echo "PAGES_ACTIVE: $(($PAGES_ACTIVE * 4096 / 1024 / 1024)) MB"
        echo "PAGES_INACTIVE: $PAGES_INACTIVE pages"
        echo "PAGES_INACTIVE: $(($PAGES_INACTIVE * 4096 / 1024 / 1024)) MB"
        echo "PAGES_SPECULATIVE: $PAGES_SPECULATIVE pages"
        echo "PAGES_SPECULATIVE: $(($PAGES_SPECULATIVE * 4096 / 1024 / 1024 )) MB"
        echo "PAGES_WIRED: $PAGES_WIRED pages"
        echo "PAGES_WIRED: $(($PAGES_WIRED * 4096 / 1024 / 1024)) MB"
        echo "FREE_MEM: $FREE_MEM pages"
        echo "FREE_MEM: $(($FREE_MEM * 4096 / 1024 / 1024)) MB"
        echo "USED_MEM: $USED_MEM pages"
        echo "USED_MEM: $(($USED_MEM * 4096 / 1024 / 1024)) MB"
        echo "TOTAL_MEM: $TOTAL_MEM pages"
        echo "TOTAL_MEM: $(($TOTAL_MEM * 4096 / 1024 / 1024)) MB"
        echo "---------------"
        # 搭載メモリ(理論値): 8GBの場合
        echo "TOTAL_MEM: $((8 * 1024)) MB (Theoretical value)"
        echo "---------------"
        echo "USED_MEM: $(($USED_MEM * 1000 / $TOTAL_MEM)) %"
    fi
}

RET=0
## メイン処理 -----
calculate_used_mem
RET=$?

## デバッグ -----
#DEBUG=yes debug

## exit
exit $RET

tmuxの設定

※ tmuxへの設定前に、念のため各スクリプトをそれぞれ単独で実行して動作確認を行なってみてください。

設定ファイル(.tmux.conf)に以下のように記述します。
カラーや区切り文字などはお好みで変更して下さい。

# ステータスライン - Right
set -g status-right '< #[fg=black,bold]#(echo $LANG)#[default] < #[fg=blue]up #(pc-running-time)#[default] < #[fg=magenta](#(loadaverage)) Mem #(used-mem)%%#[default] < #[fg=red,bold]%y/%m/%d(%a)%H:%M:%S#[default] '
# Rightの表示領域最大長
set -g status-right-length 90

以上です。

tmuxをさらにカッコよくしたい方へ
カッコイイtmuxを目指して!! - tmux-powerlineを改良したよ - よんちゅBlog

ーーー
それにしても uptime のあの加工しづらいフォーマットはなんとかならないんだろうか
vm_statもなんか行末に.(ドット)とか入ってるし、あれはいらないんじゃないだろうか