自分のサーバでその場で障害状況を見るための道具を洗練させています。

#!/bin/bash

# --- カラー定義 ---
GREEN='\033[0;32m'  # 緑:正常・低負荷
RED='\033[0;31m'    # 赤:高負荷・警告
BLUE='\033[0;34m'   # 青:ヘッダ・情報
YELLOW='\033[1;33m' # 黄:中負荷・注意
NC='\033[0m'        
BOLD='\033[1m'

# --- デフォルト設定 ---
TOP_N=10
MODE="all"

# --- ヘルプ表示 ---
usage() {
    echo -e "${BLUE}Usage: $0 [-c] [-m] [-n NUM] [-i]${NC}"
    echo "  -c    : CPU使用率順で表示"
    echo "  -m    : メモリ使用率順で表示"
    echo "  -n    : 表示行数 (Default: ${TOP_N})"
    echo "  -i    : 対話式モード (Interactive)"
    exit 0
}

# --- 対話モード (Interactive Mode) ---
interactive_mode() {
    echo -e "${BLUE}${BOLD}=== 対話設定モード ===${NC}"
    
    # モード選択
    echo -e "表示モードを選択してください:"
    echo "  1) 全て表示 (デフォルト: Enter)"
    echo "  2) CPUのみ"
    echo "  3) メモリのみ"
    read -r -p "選択 [1-3]: " mode_choice
    case "$mode_choice" in
        2) MODE="cpu" ;;
        3) MODE="mem" ;;
        *) MODE="all" ;;
    esac

    # 行数指定
    read -r -p "表示行数を入力してください (デフォルト: 10): " input_n
    if [[ "$input_n" =~ ^[0-9]+$ ]]; then
        TOP_N="$input_n"
    else
        TOP_N=10
    fi
    echo ""
}

# --- CPU情報の表示 ---
show_cpu_info() {
    echo -e "${BLUE}${BOLD}--- 💻 CPU Information ---${NC}"
    if [ -f /proc/cpuinfo ]; then
        # メーカー名 / モデル名
        local model_name
        model_name=$(grep -m 1 "model name" /proc/cpuinfo | cut -d: -f2 | sed 's/^[ \t]*//')
        # 物理コア数 (無い場合はソケット数等からフォールバック)
        local cores
        cores=$(grep -c "^processor" /proc/cpuinfo)
        # 周波数 (MHz から GHz に変換して見やすく)
        local cpu_mhz
        cpu_mhz=$(grep -m 1 "cpu MHz" /proc/cpuinfo | cut -d: -f2 | sed 's/^[ \t]*//')
        
        echo -e "  ${YELLOW}Model:${NC} ${model_name:-Unknown}"
        if [ -n "$cpu_mhz" ]; then
            # 簡易的にGHz変換(小数点以下2桁)
            local cpu_ghz
            cpu_ghz=$(awk -v mhz="$cpu_mhz" 'BEGIN {printf "%.2f", mhz/1000}')
            echo -e "  ${YELLOW}Speed:${NC} ${cpu_ghz} GHz (${cpu_mhz} MHz)"
        fi
        echo -e "  ${YELLOW}Cores:${NC} ${cores} threads"
    else
        echo -e "${RED}/proc/cpuinfo が見つかりません。${NC}"
    fi
    echo ""
}

# --- Memory & zRAM ---
show_memory_status() {
    echo -e "${BLUE}${BOLD}--- 🧠 Memory & zRAM Status ---${NC}"
    
    # free -h の表示
    echo -e "${YELLOW}[Physical Memory]${NC}"
    free -h | awk 'NR==1{print "              " $0} NR>1{print $0}'
    
    echo ""
    # zramctl の表示
    if command -v zramctl > /dev/null; then
        echo -e "${YELLOW}[zRAM Compression Status]${NC}"
        zramctl --output-all
    else
        echo -e "${RED}zramctlはこの環境にはありません。${NC}"
    fi
    echo ""
}

# --- ディスク使用量 (Storage Status) ---
show_disk_status() {
    echo -e "${BLUE}${BOLD}--- 💾 Disk Usage Status ---${NC}"
    # 主要なファイルシステム(tmpfs等を除く実ディスク)を抽出して表示
    df -h -x tmpfs -x devtmpfs -x squashfs 2>/dev/null || df -h
    echo ""
}

# --- プロセス監視 (Process Tracking) ---
show_top() {
    local sort_key="$1"
    local title="$2"
    
    echo -e "${BLUE}${BOLD}--- ${title} (Top ${TOP_N}) ---${NC}"
    
    # Header (見出し列の幅を調整してズレを防止)
    printf "${BLUE}%-6s %-6s %-8s %-12s %-20s %s${NC}\n" "%CPU" "%MEM" "PID" "USER" "UNIT" "COMMAND"
    echo "------------------------------------------------------------------------------------------"

    # ps コマンド。head/tailのロジックを整理し、空文字による awk の挙動エラーを防止
    ps -e -o pcpu,pmem,pid,user,unit:20,args --sort="${sort_key}" | \
    tail -n +2 | head -n "$TOP_N" | \
    awk -v red="$RED" -v green="$GREEN" -v yellow="$YELLOW" -v nc="$NC" '
    {
        cpu=$1; mem=$2; pid=$3; user=$4; unit=$5;
        
        # カラー判定
        color=nc;
        if (cpu > 50.0 || mem > 50.0) color=red;
        else if (cpu > 10.0 || mem > 10.0) color=yellow;
        else color=green;

        # 6列目以降のコマンド引数を結合
        cmd=""; for(i=6;i<=NF;i++) cmd=cmd" "$i;
        # 先頭の余分なスペースを削除
        sub(/^ /, "", cmd);
        
        printf "%s%-6s %-6s %-8s %-12s %-20s %-50s%s\n", color, cpu, mem, pid, user, unit, substr(cmd,1,50), nc
    }'
}

# --- 引数解析 ---
# オプション指定がない場合はデフォルトで対話モードを起動
if [ $# -eq 0 ]; then
    interactive_mode
else
    while getopts "cmn:ih" opt; do
        case $opt in
            c) MODE="cpu" ;;
            m) MODE="mem" ;;
            n) TOP_N="$OPTARG" ;;
            i) interactive_mode ;;
            h|*) usage ;;
        esac
    done
fi

# --- 実行 ---
clear
echo -e "${GREEN}監視を開始します。${NC}\n"

# システム情報の表示 (常に表示)
show_cpu_info
show_memory_status
show_disk_status

# プロセス情報の表示
case $MODE in
    cpu) show_top "-pcpu" "CPU Consumers" ;;
    mem) show_top "-pmem" "Memory Consumers" ;;
    all) 
        show_top "-pcpu" "CPU Consumers"
        echo ""
        show_top "-pmem" "Memory Consumers"
        ;;
esac

echo -e "\n${GREEN}プロセスが表示されました${NC}"

全体の動きのシナリオ

  1. 初期設定: 出力する色や、デフォルトの表示件数(10件)などを決めます。
  2. 引数のチェック(モード切り替え): * スクリプト実行時にオプション(-c-m など)が指定された場合は、その設定に従います。
  • 何も指定せず実行した場合は「対話モード」が起動し、「どの情報を」「何件表示するか」を画面上で質問されます。
  1. 画面のクリア: ターミナルを一度綺麗にしてから測定結果を表示します。
  2. ハードウェア情報の表示: CPUの型番やコア数、メモリの使用量、ディスクの空き容量を順番に表示します。
  3. 高負荷プロセスの表示: 設定されたモード(CPU順、メモリ順、または両方)に合わせて、リソースを多く消費しているプロセスをランキング形式で色付き表示します。

📦 各関数の役割と解説

1. usage(ヘルプ表示)

使い方を間違えた時や、-h オプションを付けた時に、コマンドのオプション一覧を表示してスクリプトを終了します。

2. interactive_mode(対話設定モード)

引数なしで実行された時に呼ばれます。read コマンドを使ってユーザーに入力を促し、表示したいモード(全て/CPUのみ/メモリのみ)や、ランキングを何件表示するか(デフォルト10件)を動的に決定します。

3. show_cpu_info(CPU情報の表示)

Linuxのシステムファイル /proc/cpuinfo を読み込んで解析します。

  • CPUのモデル名、スレッド数(コア数)を取得します。
  • 周波数(MHz)を取得し、awk を使って計算し GHz 単位に変換して見やすく表示します。

4. show_memory_status(メモリとzRAMの状況)

  • free -h コマンドで、人間が見やすい単位(GBやMB)で物理メモリの空き状況を表示します。
  • zramctl コマンドがある環境(メモリ圧縮技術 zRAM が有効な環境)では、その圧縮ステータスも同時に表示します。

5. show_disk_status(ディスク使用量)

  • df -h コマンドでストレージの残量を表示します。
  • その際、-x tmpfs などを指定することで、メモリ上の仮想ファイルシステムを除外した「実際の物理ディスク(SSDやHDD)だけ」を狙って表示する工夫がされています。

6. show_top(プロセス監視のコア処理)

  • ps コマンドで現在動いているプロセスの一覧を、指定されたリソース(CPUまたはメモリ)の消費量が多い順に並び替えて取得します。
  • tailhead を使って、指定された件数(デフォルト10件)だけを切り出します。
  • awk を使ってデータを1行ずつ処理し、CPUまたはメモリの使用率が50%を超えていれば「赤」、10%を超えていれば「黄」、それ以下なら「緑」に文字色をリアルタイムに変化させて出力します。

スクリプトの使い方

実行する際のオプションによって、動きを切り替えることができます。

オプション実行例動き
(なし)./script.sh対話モード。画面の指示に従って入力する。
-c./script.sh -cCPU使用率の高いプロセスをトップ10で表示する。
-m./script.sh -mメモリ使用率の高いプロセスをトップ10で表示する。
-n [数値]./script.sh -c -n 5CPUの高いプロセスを上位5件だけ表示する。
-h./script.sh -hヘルプ(使い方の説明)を表示する。

LinuxサーバーやPCの健康状態を、コマンド一つでパッと色鮮やかに確認できる非常に実用的かつ便利なものに仕上げた自負があります。