1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

bashスクリプトがカップ/メモリ/ディスクの使用量を監視する方法

2022-01-05 01:10:22

このブログで書かれていることは、実際にはあまり役に立ちませんし、このようなスクリプトを使って監視することはないでしょう。しかし、自分で書くことで、初心者はCPU、メモリ、ディスクなどの基本や基本コマンドをより深く理解することができるようになります。

#! /bin/bash

#Get the memory situation
mem_total=`free | awk 'NR==2{print $2}'` #Get the total memory size
mem_use=`free | awk 'NR==2{print $3}'` #Get memory usage size

#Statistic memory usage (size used/total size)
mem_use_rate=`awk 'BEGIN{print('$mem_use'/'$mem_total')*100}'| awk '{print int($0)}'`
#echo $mem_use_rate ----------

#get disk usage rate
disk_use_rate_str=`df -h | grep /dev/vda1 | awk -F '[ %]+' '{print $5}'| awk '{print int($0)}'`

# Get cpu usage rate
cpu_use_rate=`top -n 1 | grep Cpu |awk '{print $2}'| awk '{print int($0)}'`

#Alarm time
file_log=/home/error.log #create in advance
now_time=`date '+%F %T'`

function send_mail(){

}


function check(){

        if [[ "men_use_rate" > 50 ]] || [[ "disk_use_rate" > 50 ]] || [[ "cpu_use_rate" > 50 ]];then
                echo "Alarm time: "$now_time > $file_log
                echo "cpu usage:${cpu_use_rate}% --> disk usage: ${disk_use_rate}% --> memory usage: ${men_use_rate}%"
                send_mail
        fi
}

function main(){
        check
}
main

注:awk '{print int($0)}' です。

浮動小数点数を整数に変換して、大きさを比較することができます。シェルは浮動小数点と整数の直接比較はサポートしていません。
bcを使用する必要がある計算
if [[ "men_use_rate" > 50 ]] is equivalent to if [ $men_use_rate > 50 ]。

bcの例です。

#! /bin/bash
var1=20
var2=3.14159
var3=`echo "scale=0;$var2 - $var1 " | bc`
echo $var3

var4=`echo "$var1 < $var2"| bc`
echo $var4

最もメモリを消費する上位 40 プロセスを表示します。

ps auxw|head -1;ps auxw|sort -rn -k4|head -40


ベースリソースアラートスクリプトを行う自動化タスク

#! /bin/bash
now=`date -u -d"+8 hour" +'%Y-%m-%d %H:%M:%S'`
#cpu usage threshold
cpu_warn='85'
#mem idle threshold
mem_warn='1000'
#disk usage threshold
disk_warn='90'

#--cpu
item_cpu () {
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}'|cut -f 1 -d ". "`
cpu_use=`expr 100 - $cpu_idle`
echo "$now Current cpu usage is $cpu_use" >> /tmp/monitoring.log
if [ $cpu_use -gt $cpu_warn ]
    then
        echo "cpu warning!!!! "
    else
        echo "cpu ok!!!! "
fi
}
#--mem
item_mem () {
#-MB as unit
mem_free=`free -m | grep "Mem" | awk '{print $4+$6}'`
echo "$now Current memory space remaining is ${mem_free}MB" >> /tmp/monitoring.log
if [ $mem_free -lt $mem_warn ]
    then
        echo "mem warning!!!! "
    else
        echo "mem ok!!!! "
                
fi
}
#--disk
item_disk () {
disk_use=`df -P | grep /dev/vda2 | grep -v -E '(tmp|boot)' | awk '{print $5}' | cut -f 1 -d "%"`
echo "$now Current disk usage is $disk_use" >> /tmp/monitoring.log
if [ $disk_use -gt $disk_warn ]
    then
        echo "disk warning!!! "
    else
        echo "disk ok!!! "
        
fi


}

item_cpu
item_mem
item_disk

無料のツールを使って、メモリの使用状況を監視し、80以上のアラートを出し、最もメモリを使用している上位10プロセスを抽出することができます。

コードは以下の通りです。

#! /bin/bash
#!
total=$(free -m | sed -n '2p' | awk '{print $2}')
used=$(free -m | sed -n '2p' | awk '{print $3}')
free=$(free -m | sed -n '2p' | awk '{print $4}')
shared=$(free -m | sed -n '2p' | awk '{print $5}')
buff=$(free -m | sed -n '2p' | awk '{print $6}')
cached=$(free -m | sed -n '2p' | awk '{print $7}')
rate=`echo "scale=2;$used/$total" | bc | awk -F. '{print $2}'`
echo -e "total\tused\tfree\tshared\tbuffer\tavailable"
echo -e "${total}M\t${used}M\t${free}M\t${shared}M\t${buff}M\t${cached}M\nrate:${rate}%"
if [ $rate -ge 80 ]
then echo "Memory Warn"
    ps aux | grep -v USER | sort -rn -k4 | head
fi

dfコマンドでディスク使用率を監視し、80以上のアラームを出す。

df : ディスクパーティションの使用可能なディスク容量を表示します。

  -h : より読みやすい形で表示します。

  -P POSIX 出力形式を使用します。

#! /bin/bash
#!
DEV=`df -hP | grep '^/dev/*' | cut -d' ' -f1 | sort`
for I in $DEV
do dev=`df -Ph | grep $I | awk '{print $1}'`
size=`df -Ph | grep $I | awk '{print $2}'`
used=`df -Ph | grep $I | awk '{print $3}'`
free=`df -Ph | grep $I | awk '{print $4}'`
rate=`df -Ph | grep $I | awk '{print $5}'`
mount=`df -Ph | grep $I | awk '{print $6}'`
echo -e "$I:\tsize:$size\tused:$used\tfree:$free\trate:$rate\tmount:$mount"
F=`echo $rate | awk -F% '{print $1}'`
if [ $F -ge 80 ]; then
    echo "$mount Warn"
    else echo "It's OK"
fi
done

今回の記事は、bashスクリプトでcup/memory/diskの使用量を監視する方法について書いています。bashでcup/memory/diskの使用状況を監視する方法については、Script Houseの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。