使用shell脚本监控少量服务器并发送微信告警信息
01. 概括
1.0 脚本更新地址
Git更新地址:shell_monitor_script.sh
文章原文地址:使用shell脚本监控少量服务器并发送微信告警信息
1.1 前提:
平台系统:linux系统下
接收信息:微信企业号
1.2 脚本说明
需要修改微信接口
脚本对应参数的修改:包括IP,告警阈值等
1.3 脚本使用
该脚本监控包括Disk、CPU、MEM、LOAD等主机资源,以及docker服务和docker容器。
将该脚本附件假定放于:/home/mai/.check_host.sh。
那么在定时任务上可以增加定时任务:
$ echo "## 每分钟执行监控脚本一次" | sudo tee -a /etc/crontab
$ echo "*/1 * * * * mai bash /home/mai/.check_host.sh" | sudo tee -a /etc/crontab
02. 脚本附件
#!/bin/bash
#!/bin/bash
# Create for mai
# Copyright http://www.mairoot.com
# Create date 2018-07-21
# Using check host source
# Noting delete content
# Shell Option $@
# 01.获取主机资源
function sys_info()
{
# 系统信息
Date=`date +%Y-%m-%d`
Date_time=`date "+%Y-%m-%d__%H:%M:%S"`
Host_name=`hostname`
IP_net_dev="ens33"
IP_addr=`ifconfig $IP_net_dev|grep "inet addr"|awk -F":" '{print $2}'|awk -F" " '{print $1}'`
# 主机资源
Disk_rate_sys=`df -h|grep \/\$|awk -F" " '{ print $5 }'`
Disk_rate_sys2=${Disk_rate_sys%%%}
Disk_rate_data=`df -h|grep \/boot\$|awk -F" " '{ print $5 }'`
Disk_rate_data2=${Disk_rate_data%%%}
CPU_free=`vmstat |tail -1|awk -F" " '{print $15}'`
Load_ave15=`uptime |awk '{ print $NF }'|awk -F" " '{ print $1 }'`
Load_ave15_1=`expr $Load_ave15`
Mem_Total_kb=`cat /proc/meminfo | grep "MemTotal"|awk -F":" '{print $2}'|awk '{print $1}'`
Mem_Free_kb=`cat /proc/meminfo | grep "MemFree"|awk -F":" '{print $2}'|awk '{print $1}'`
Mem_Total=`expr $Mem_Total_kb / 1024`
Mem_Free=`expr $Mem_Free_kb / 1024`
# 微信接口
CropID='ww4730ead71a1818a6'
Secret='1Nu6vcloj8SGzs6XqsIhuZVk1lO3khVS1j_GY6XEbFo'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
To_User="mairoot"
To_Party="1"
Agent_ID="1000001"
# 日志目录
if [ ! -d "/tmp/logs_check" ]; then mkdir /tmp/logs_check; fi
Logs_file='/tmp/logs_check'
# 远程地址
SSH_addr="192.168.3.12:22"
# 运行业务
Project_mode="测试机"
}
# 02.主机资源磁盘、CPU、MEM、LOAD
# 2.1 判断根磁盘使用率超额
#系统盘使用率
function sys_disk()
{
if [ $Disk_rate_sys2 -gt 80 ]
then
echo "$Date_time 磁盘使用率超额" >> $Logs_file/disk_rate.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'磁盘使用:目录/为${Disk_rate_sys}'"},"safe":"0"}' $PURL
else
echo "$Date_time 磁盘使用率良好:$Disk_rate_sys" >> $Logs_file/disk_rate.$Date.log
fi
#数据盘使用率
if [ $Disk_rate_data2 -gt 80 ]
then
echo "$Date_time 磁盘使用率超额" >> $Logs_file/disk_rate.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'磁盘使用:目录/data为${Disk_rate_data}'"},"safe":"0"}' $PURL
else
echo "$Date_time 磁盘使用率良好:$Disk_rate_data" >> $Logs_file/disk_rate.$Date.log
fi
}
# 2.2 判断MEM使用
function sys_mem()
{
if [ $Mem_Free_kb -lt 102400 ]
then
echo "$Date_time MEM空闲少于100M" >> $Logs_file/MEM_free.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'内存总共:${Mem_Total}MB'\n'内存剩余:${Mem_Free}MB'"},"safe":"0"}' $PURL
else
echo "$Date_time MEM空闲良好:$Mem_Free" >> $Logs_file/MEM_free.$Date.log
fi
}
# 2.3 判断CPU空闲值过低
function sys_cpu()
{
if [ $CPU_free -lt 10 ]
then
echo "$Date_time CPU空闲率少于10%" >> $Logs_file/CPU_free.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'CPU空闲:${CPU_free}%'"},"safe":"0"}' $PURL
else
echo "$Date_time CPU空闲率良好:$CPU_free%" >> $Logs_file/CPU_free.$Date.log
fi
}
# 2.4 判断服务器15分钟负载过高
function sys_load()
{
if [ `expr $Load_ave15_1 \> 0` -gt 1 ]
then
echo "$Date_time 服务器15分钟负载过高:$Load_ave15%" >> $Logs_file/Load_ave15.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'主机负载:${Load_ave15}%'"},"safe":"0"}' $PURL
else
echo "$Date_time 服务器15分钟负载良好:$Load_ave15%" >> $Logs_file/Load_ave15.$Date.log
fi
}
# 03.检查服务
# 3.1 检查docker服务存活
function docker_status()
{
ps -ef|grep docker |grep -v grep
if [ $? -eq 0 ]
then
Date_time311=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time311:docker is up" >> $Logs_file/Docker_pro.$Date.log
else
Date_time312=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time312:Docker服务第一次停止" >> $Logs_file/docker.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time312}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'发生事件:Docker第一次停止'"},"safe":"0"}' $PURL
service docker start
Os_code=$?
if [ $Os_code -eq 0 ]
then
Date_time313=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time313:Docker_rec is up" >> $Logs_file/docker.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time313}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'发生事件:Docker服务恢复'"},"safe":"0"}' $PURL
elif [ $Os_code -ne 0 ]
then
Date_time314=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time314:Docker重启失败" >> $Logs_file/docker.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time314}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'发生事件:Docker服务停止'"},"safe":"0"}' $PURL
fi
fi
}
# 3.2 检查docker容器存活
# docker Container_ID 自下向上
function docker_container()
{
#Container_ID_ALL=("2ac5dfa2cd4e" "36c6485bf415" "a2a46bfde7bb" "3ad69c74ef9c")
#Container_ID_ALL="`docker ps -aq`"
Container_ID_ALL="`docker ps -q`"
for Container_ID in ${Container_ID_ALL[@]}
do
Container_Name=`docker inspect -f='{{.Name}}' $(docker ps -a -q|grep $Container_ID)|awk -F"/" '{print $2}'`
docker ps |grep $Container_ID
if [ $? -eq 0 ]
then
Date_time321=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time321:$Container_Name is up" >> $Logs_file/Docker_Container.$Date.log
else
docker start $Container_ID
Os_code=$?
if [ $Os_code -eq 0 ]
then
Date_time322=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time322:$Container_Name is up" >> $Logs_file/Docker_Container.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time322}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'发生事件:${Container_Name}服务恢复'"},"safe":"0"}' $PURL
elif [ $Os_code -ne 0 ]
then
Date_time323=`date "+%Y-%m-%d__%H:%M:%S"`
echo "$Date_time323:$Container_Name重启失败" >> $Logs_file/Docker_Container.$Date.log
/usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'获取时间:${Date_time323}'\n'运行业务:${Project_mode}'\n'远程地址:${SSH_addr}'\n'内网地址:${IP_addr}'\n'主机名称:${Host_name}'\n'发生事件:${Container_Name}服务停止'"},"safe":"0"}' $PURL
fi
fi
done
}
# 10 调用函数
sys_info
sys_disk
sys_cpu
sys_mem
sys_load
docker_status
docker_container
03. 微信接收信息
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HAProxy高性能软负载均衡器
现在公司实现高可用已经成为必不可少的一环,在众多的负载均衡集群方案中,Haproxy是比较有名的一个。它可以实现TCP或Http的负载均衡。优点如下: 免费开源,与硬件负载均衡相比划算很多 最高可以维护40000~50000个并发,作为软件级别的负载均衡来说,实在强大 支持多种负载均衡算法,同时支持session保持 支持虚拟主机 拥有服务器监控页面,可以了解系统的实时运行状态 借用官网的图,图中的HA即为Haproxy软件,下面的PROXY为要代理的服务器,客户端只需要访问HA,相当于在访问PROXY。 image.png 演示 像这种软件的东西,直接动手比说理论有用的多。我还是基于Docker演示,明白其原理主要是配置文件,用虚拟机或容器都是类似的。 拉取Haproxy:1.8镜像 docker pull haproxy:1.8 拉取httpd镜像,并且准备web容器 docker pull httpd:2.4 docker run -it -d --name web1 httpd:2.4 docker run -it -d --name web2 httpd:2.4 docker...
- 下一篇
在docker中远程调用PhantomJS
背景:写了一个爬虫程序使用的docker部署,部署后在docker中安装PhantomJS 比较麻烦,于是想到了再另一个docker容器中部署一个PhantomJS ,通过远程调用的方式来使用它 1.启动一个PhantomJS docker实例 [root@Ieat1 ~]# docker run -d --name phantomjs -p 8910:8910 wernight/phantomjs phantomjs --webdriver=8910 2.通过程序远程调用 通过Java 调用: WebDriver driver = new RemoteWebDriver( new URL("http://127.0.0.1:8910"), DesiredCapabilities.phantomjs()); 通过python调用,先运行 pip install selenium安装selenium from selenium import webdriver from selenium.webdriver.common.desired_capabilities import Desir...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群