如何用shell腳本監控服務器負載、cpu、內存、硬盤和登陸用戶數

說明:此腳本安裝在CentOS的操做系統上vim

1、監控腳本以下bash

vim  /root/script/systemmonitor.sh服務器

#!/bin/bash
#監控系統負載與CPU、內存、硬盤、登陸用戶數,超出警惕值則發郵件告警。app

#提取本服務器的IP地址信息
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`less

# 一、監控系統負載的變化狀況,超出時發郵件告警:ide

#抓取cpu的總核數
cpu_num=`grep -c 'model name' /proc/cpuinfo`ui

#抓取當前系統15分鐘的平均負載值
load_15=`uptime | awk '{print $12}'`this

#計算當前系統單個核心15分鐘的平均負載值,結果小於1.0時前面個位數補0。
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`spa

#取上面平均負載值的個位整數
average_int=`echo $average_load | cut -f 1 -d "."`操作系統

#設置系統單個核心15分鐘的平均負載的告警值爲0.70(即便用超過70%的時候告警)。
load_warn=0.70

#當單個核心15分鐘的平均負載值大於等於1.0(即個位整數大於0) ,直接發郵件告警;若是小於1.0則進行二次比較
if (($average_int > 0)); then
echo "$IP服務器15分鐘的系統平均負載爲$average_load,超過警惕值1.0,請當即處理!!!" | mail -s "$IP 服務器系統負載嚴重告警!!!"   m1111111111@163.com
else

#當前系統15分鐘平均負載值與告警值進行比較(當大於告警值0.70時會返回1,小於時會返回0 )
load_now=`expr $average_load \> $load_warn`

#若是系統單個核心15分鐘的平均負載值大於告警值0.70(返回值爲1),則發郵件給管理員
if (($load_now == 1)); then
echo "$IP服務器15分鐘的系統平均負載達到 $average_load,超過警惕值0.70,請及時處理。" | mail -s "$IP 服務器系統負載告警"  m1111111111@163.com
fi

fi

# 二、監控系統cpu的狀況,當使用超過80%的時候發告警郵件:

#取當前空閒cpu百份比值(只取整數部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`

#設置空閒cpu的告警值爲20%,若是當前cpu使用超過80%(即剩餘小於20%),當即發郵件告警
if (($cpu_idle < 20)); then
echo "$IP服務器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。" | mail -s "$IP 服務器CPU告警" m1111111111@163.com
fi

# 三、監控系統交換分區swap的狀況,當使用超過90%的時候發告警郵件:

#系統分配的交換分區總量
swap_total=`free -m | grep Swap | awk '{print $2}'`

#當前剩餘的交換分區free大小
swap_free=`free -m | grep Swap | awk '{print $4}'`

#當前已使用的交換分區used大小
swap_used=`free -m | grep Swap | awk '{print $3}'`

if (($swap_used != 0)); then
#若是交換分區已被使用,則計算當前剩餘交換分區free所佔總量的百分比,用小數來表示,要在小數點前面補一個整數位0
swap_per=0`echo "scale=2;$swap_free/$swap_total" | bc`

#設置交換分區的告警值爲10%(即便用超過90%的時候告警)。
swap_warn=0.10

#當前剩餘交換分區百分比與告警值進行比較(當大於告警值(即剩餘10%以上)時會返回1,小於(即剩餘不足10%)時會返回0 )
swap_now=`expr $swap_per \> $swap_warn`

#若是當前交換分區使用超過90%(即剩餘小於10%,上面的返回值等於0),當即發郵件告警
if (($swap_now == 0)); then
echo "$IP服務器swap交換分區只剩下 $swap_free M 未使用,剩餘不足10%,使用率已經超過90%,請及時處理。" | mail -s "$IP 服務器內存告警" m1111111111@163.com
fi

fi

# 四、監控系統硬盤根分區使用的狀況,當使用超過80%的時候發告警郵件:

#取當前根分區(/dev/sda2)已用的百份比值(只取整數部分)
disk_sda2=`df -h | grep /dev/sda2 | awk '{print $5}' | cut -f 1 -d "%"`

#設置空閒硬盤容量的告警值爲80%,若是當前硬盤使用超過80%,當即發郵件告警
if (($disk_sda2 > 80)); then
echo "$IP 服務器 /根分區 使用率已經超過80%,請及時處理。" | mail -s "$IP 服務器硬盤告警" m1111111111@163.com
fi

#五、監控系統用戶登陸的狀況,當用戶數超過3個的時候發告警郵件:

#取當前用戶登陸數(只取數值部分)
users=`uptime | awk '{print $6}'`

#設置登陸用戶數的告警值爲3個,若是當前用戶數超過3個,當即發郵件告警
if (($users >= 3)); then
echo "$IP 服務器用戶數已經達到$users個,請及時處理。" | mail -s "$IP 服務器用戶數告警" m1111111111@163.com
fi

 

2、給腳本添加執行權限

chmod  +x   /root/script/systemmonitor.sh

 

3、將腳本加入計劃任務

 cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# For details see man 4 crontabs


# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name command to be executed


*/1 * * * *  root  /root/script/systemmonitor.sh

 

4、發郵件到本身註冊的163郵箱

(1)首先要安裝mailx

yum  install  -y   mailx

(2) 其次配置mail.rc,配置文件以下

cat  /etc/mail.rc
# This is the configuration file for Heirloom mailx (formerly
# known under the name "nail".
# See mailx(1) for further options.
# This file is not overwritten when 'make install' is run in
# the mailx build process again.

# Sccsid @(#)nail.rc    2.10 (gritter) 3/4/06

# Do not forward to mbox by default since this is likely to be
# irritating for most users today.
set hold

# Append rather than prepend when writing to mbox automatically.
# This has no effect unless 'hold' is unset again.
set append

# Ask for a message subject.
set ask

# Assume a CRT-like terminal and invoke a pager.
set crt

# Messages may be terminated by a dot.
set dot

# Do not remove empty mail folders in the spool directory.
# This may be relevant for privacy since other users could
# otherwise create them with different permissions.
set keep

# Do not remove empty private mail folders.
set emptybox

# Quote the original message in replies by "> " as usual on the Internet.
set indentprefix="> "

# Automatically quote the text of the message that is responded to.
set quote

# Outgoing messages are sent in ISO-8859-1 if all their characters are
# representable in it, otherwise in UTF-8.
set sendcharsets=iso-8859-1,utf-8

# Display sender's real names in header summaries.
set showname

# Display the recipients of messages sent by the user himself in
# header summaries.
set showto

# Automatically check for new messages at each prompt, but avoid polling
# of IMAP servers or maildir folders.
set newmail=nopoll

# If threaded mode is activated, automatically collapse thread.
set autocollapse

# Hide some header fields which are uninteresting for most human readers.
ignore received in-reply-to message-id references
ignore mime-version content-transfer-encoding

# Only include selected header fields when forwarding messages.
fwdretain subject date from to

# For Linux and BSD, this should be set.
set bsdcompat
set from=1111111111@163.com
set smtp=smtp.163.com
set smtp-auth-user=m1111111111@163.com
set smtp-auth-password=wxhjshfjsjdfsjdfjdhjdsfh       #這個是163.com的POP開通驗證碼
set smtp-auth=login
set ssl-verify=ignore

(3)重啓郵件服務,若是沒有sendmail就yum安裝yum  install -y  sendmail

service  sendmail  restart     ##二次,第一次失敗

service  sendmail  restart    ##第二次成功

 

(4)驗證

echo  "test"  | mail -s "test"  m1111111111@163.com

(5)查看163.com的郵箱發現有郵件說明成功

這裏要先開通163的郵件協議,開通以前要開通驗證碼這個只出現一次要記好,這個就是mail.rc的smtp-auth-password密碼,以前不須要,如今163改變了。

相關文章
相關標籤/搜索