因为服务器上的服务或者应用程序会出现挂掉的情况,所以需要做一套脚本来监控相关的进程和程序。
也调查了相关的第三方,但都没有合适的,要么收费,要么就是比较重量级的。
基本实现需求如下:
以下是相关代码,希望对有需要的朋友有所帮助,shell一直没用过,有不足之处请指出。
相关的公用配置信息
export LOGPATH="/chroot/wwwlogs/checklogs" #日志目录
export DATE=`date +%Y%m%d-%H` #年月日时
export DATETIME=`date +%Y%m%d-%H:%M`
export MAINSERVER="127.0.0.145" #当前服务器IP
mkdir -p /chroot/wwwlogs/checklogs #创建日志目录
验证指定的进程是否存在
checkProcess(){
HOST=$1
PROCESS=$2
local MESSAGE=""
local RET="0"
#验证进程是否存在
status=`ps -A | grep $PROCESS`
if [ "$status" != "" ]
then
MESSAGE="服务:(${PROCESS}),进程存在(执行函数checkProcess)."
RET="1"
else
MESSAGE="服务:(${PROCESS}),进程不存在(执行函数checkProcess)."
RET="0"
#发送邮件提示通知
fi
#调用信息处理函数
showMessage $MESSAGE $RET;
return 0;
}
#主要指对本台主机的服务检测
#循环检测Mysql、Nginx、PHP进程是否存在
PROCESS=('mysql' 'nginx' 'php') #进程名称
for ((i=0; i<"${#PROCESS[*]}"; i++))
do
checkProcess $MAINSERVER ${PROCESS[$i]}
done
ping指定的服务器是否正常
#
# ping指定的服务器是否通
# $1 当前服务器IP地址
# $2 ping的对方服务器IP地址
# $3 对ping的服务器描述信息
#
pingCmd(){
PRE="server$1Ping$2,($3)"
ping -w 1 -c 1 $2>/dev/null
ret=$?
MESSAGE=""
MRET="0"
if [ $ret -eq 0 ]
then
MESSAGE="命令($PRE),状态OK(执行函数pingCmd)"
MRET="1"
else
MESSAGE="命令($PRE),状态ERROR(执行函数pingCmd)"
MRET="0"
#发邮件提示
fi
#调用信息处理函数
showMessage $MESSAGE $MRET
return 0
}
#主要指对其它服务器的ping操作
#循环ping多台服务器
SERVERS_IP=('127.0.0.1' '127.0.0.2') #验证服务器的IP地址
SERVERS_DESCRIPTION=('服务器A' '服务器B' ) #验证服务器的描述
for ((i=0; i<"${#SERVERS_IP[*]}"; i++))
do
pingCmd $MAINSERVER ${SERVERS_IP[$i]} ${SERVERS_DESCRIPTION[$i]}
done
登录指定服务器Mysql是否成功
#
# 验证指定服务器的Mysql是否可以登录
# $1 当前服务器IP地址
# $2 ping的对方服务器IP地址
# $3 对ping的服务器描述信息
#
loginMysql(){
#mainserver=$1
local host=$1
local port='3306'
local user=$2
local password=$3
mysqlclient='mysql'
$mysqlclient --host=$host --port=$port --user=$user --password=$password -e "show databases;" > /dev/null 2>&1
MESSAGE=""
RET="0"
if [ $? == 0 ]
then
MESSAGE="ip:($host),mysql登录successfully"
RET="1"
else
MESSAGE="ip:($host),mysq登录faild"
RET="0"
fi
#调用信息处理函数
showMessage $MESSAGE $RET
}
#主要指对本机或其它服务器的Mysql登录操作
#登录Mysql验证是否登录成功
HOST=('127.0.0.1') #服务器IP
USER=('user') #Mysql用户名
PASSWORD=('password') #Mysql密码
for ((i=0; i<"${#HOST[*]}"; i++))
do
loginMysql ${HOST[$i]} ${USER[$i]} ${PASSWORD[$i]}
done
指定的Tomcat服务是否存在
#
# 验证tomcat进程状态
# $1 tomcat路径
# $2 端口号
# $3 tomcat项目描述
#
checkTomcat(){
TOMCATPATH=$1
TOMCATPORT=$2
TOMCATDESCRIPTION=$3;
cd $TOMCATPATH
pIDa=`/usr/sbin/lsof -i :$TOMCATPORT|grep -v "PID" | awk '{print $2}'`
#echo $pIDa;
MESSAGE=""
RET="0"
if [ "$pIDa" != "" ];
then
MESSAGE="tomcatPath:$TOMCATPATH;tomcatPort:$TOMCATPORT($TOMCATDESCRIPTION);进程存在.";
RET="1"
else
MESSAGE="tomcatPath:$TOMCATPATH;tomcatPort:$TOMCATPORT($TOMCATDESCRIPTION);进程不存在.";
RET="0"
fi
#调用信息处理函数
showMessage $MESSAGE $RET
}
#主要指对本机的Tomcat服务操作
#循环检测多个Tomcat状态
TOMCAT_PATH=('/data/server/apache-tomcat-aa/' '/data/server/apache-tomcat-bb/') #tomcat地址
TOMCAT_PORT=('9558' '8544') #tomcat端口
TOMCAT_DESCRIPTION=('项目AA' '项目BB') #tomcat项目描述
for ((i=0; i<"${#TOMCAT_PATH[*]}"; i++))
do
checkTomcat ${TOMCAT_PATH[$i]} ${TOMCAT_PORT[$i]} ${TOMCAT_DESCRIPTION[$i]}
done
检测网站的状态是否返回200
#
# 验证Web网站是否返回200状态码
# $1 网站的URL
# $2 网站的名称
#
checkWebsite(){
WEBSITE=$1
DESCRIPTION=$2
CODE=`curl -A "Mozil5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" -o /dev/null -s -m 10 -e "api.snaillove.com" -w %{http_code} $WEBSITE`
#echo "checkWebsite..CODE===$CODE";
MESSAGE=""
RET="0"
if [ $CODE == "200" ]
then
MESSAGE="网站$DESCRIPTION($WEBSITE)访问正常"
RET="1"
else
MESSAGE="网站$DESCRIPTION($WEBSITE)访问失败"
RET="0"
fi
#调用信息处理函数
showMessage $MESSAGE $RET
}
#主要指对相关网页状态的操作
#循环检测多个网页URL状态码是否200
WEBSITE=('aa.bb.com' 'cc.bb.com') #网站地址
WEBSITEDESCRIPTION=('项目A' '项目B') #网站描述
for ((i=0; i<"${#WEBSITE[*]}"; i++))
do
checkWebsite ${WEBSITE[$i]} ${WEBSITEDESCRIPTION[$i]}
done
统一的结果处理方法
#
# 统一日志和信息输出函数
# $1 提示内容
# $2 运行结果状态值
#
#export SENDMAILS="xianglingchuan@sina.cn"
showMessage(){
local MESSAGE=$1;
local RET=$2;
INFO="IP:($MAINSERVER) TIME:$DATETIME RET:$RET MESSAGE: $MESSAGE\n"
echo $INFO;
echo -e "$INFO" >> $LOGPATH/$DATE.log;
#发送邮件命令
if [ $RET -eq 1 ]
then
echo "状态正常不用发送邮件.\n"
else
echo "发送异常邮件.\n"
MAILINFO="<b>IP:</b>($MAINSERVER)<BR><BR><B>TIME:</B>$DATETIME<BR><BR><B>RET:</B>$RET<BR><BR><B>MESSAGE:</B>$MESSAGE<BR><BR>"
echo "$MAILINFO" | mail -s "$(echo -e "$MAINSERVER 服务器监控异常通知\nContent-Type: text/html")" $SENDMAILS
fi
return 1;
}
然后在crontab中添加如下代码,就可以完成对相关服务的监控了。
每三分钟进行一次访问。
# 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
*/3 * * * * root sh /chroot/shell/checkServer.sh >> /chroot/wwwlogs/checkServer.log