一,Python简介
二,监控基本原理
三,监控框架代码分析
四,监控源代码分析
五, 文章总结有福利
为什么要脚本监控呢,这是个非常严重需要注意的问题,为什么需要一个脚本监控,
因为脚本监控是服务器的进程,
如果写代码不够健壮,他运行十几天二十几天他突然蹦了,怎么办如果这时候有一个脚本去监控服务进程就可以节省自己很多时间,
一,Python简介
Python是近年来最火的一个热点,没有之一。从性质上来讲它和我们熟知的C、JAVA、php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜)。
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
优点
1.“优雅”、“明确”、“简单”- 所以Python程序看上去总是简单易懂,
2. 开发效率高- Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,
3. 高级语言- 当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节
4,如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
5. 由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工 作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就几乎可以在市场上所有的系统平台上运行
6. 如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
缺点
7. 代码运行速度慢
8. 发布程序时必须公开源代码
二,监控基本原理
1. cactio
cacti不是监控工具,他是个依赖于SNMP的数据采集和数据呈现的工具。
数据采集、 保存数据[SQL, txt].
数据展示(rrdtool 绘图)。
数据分析和报警(很一般)。
2. nagIOS。
功能:数据报警(报警功能是Nagios的特色功能) [ 故障触发,故障恢复都可以。
依赖分析报警(能自动的识别到关键设备的故障,关联设备不会报警)。
数据采集(采集的数据是弱项,他只关心警戒位,只关心正常与否的状态,状态转换时可以实现报警,所以它采集的数据不需要保存),当然也有插件弥补这个不足,如PNP4Nagios。
3. zabbix (php)(推荐)
Nagiostcacti整合互相弥补不足!I
nagios和 cacti不适合超大规模的监控、由于大规模的带宽和网络限制,会导致监控的延迟等问题,所以有很多是 nagios+ cacti整合,但是依然不适合在大规模的环境中,不适合分布式部署, Nagios在大规模中就会出现延迟,失
去 Nagios本事的特色。
那么 zabbix同时整合了 cacti和 Nagios特点的工具,而且还具有了前两者不具有的工具,支持分布式等等。
4. 补充工具:
netdata:托管在github上的一款类型zabbix的开源监控工具https:/
/github. com/firehol/netdata
open- falcon:小米公司开源的企业级监控工具(python)(推荐)
Ganglia类似于 zabbix,大型分布式监控系统
开源监控工具对比http://www.oschina.net/news/67525/monitoring-tools
5. 监控软件数据采集的方式
SNMP 协议。
agent 代理的方式去采集数据。
shell 脚本api 接口
6. 数据展示方式
7. 数据告警
mail,msm,微信,电话,钉钉机器人
三,框架源代码分析
常见shell
基本结构
基本脚本构成
命令
if [-n/-z $string] #如果string非空/空,返回True;
if [xx1 -d/-a/-o xx2] #不存在、并列(文件1比文件2新)、或;
[-e/-d/-f/-L/-r/-s/-h FILENAME] #如果FILENAME存在/为目录/为常规文件/符号链接/可读/长度不为0/软链接,则为真
范围
seq a b
seq -w b
循环、条件
xpect
1. 测试一:监控磁盘的使用率,>90%时给root发邮件
2.测试二:写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
法一:
# !/bin/bash
IP=`netstat -nut | awk '{print $5}' | cut -d: -f1 | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i in ip)print ip[$1],i}' | sort -n
IP=`netstat -nut | awk '{print $5}' | cut -d: -f1 | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i i n ip)print ip[$1],i}' | sort -n | awk '{if($1>1)p rint $2}'`
3. 测试三:查看10.0.0.0/24网段中的在线用户数;
ping:测试主机间网络的连通性
22. env CLOUD_MySQL_ENV=test exec /opt/cloud_mysql/bin/uwsgi --die-on-term --ini /opt/cloud_mysql/conf/uwsgi.in
nmap:一款开源的网络探测器和安全审核工具,它可以快速扫描大型网络
4. 批量创建文件及改名(不同的系统语法有所不同,此为另一种思路)
15.passwd=`echo $(date+%t%N)$RANDOM|md5sum|cut -c 2-9` #$RANDOM表示内部变量,可以创建随机数;date+X%设置系统时间格式
16. useradd oldboy$n >&/dev/null&& user_status=$?
17. echo "$passwd"|passwd --stdinoldboy$n >&/dev/null && pass_status=$? #用echo xxx | yyy --stdin zzz,其中xxx为和终端交互内容
python
#当前时间
time.strtime(’%y-%m-%d’)
#磁盘状态
os.open('df -h ',‘r’).readline()
#表示形态
‘n’.join(xxx)
#写入数据
f.write(’%s’ % str)、f.flush() 、f.close()
四,监控源代码分析
1,PS命令查看linux程序进程
2,shell脚本
利用PS命令查看server进程的状态,如死亡、就重新启动。做一个死循环轮训。
30秒去轮询这个这个进程。死亡就继续重启。
3,效果
PS查看进程号,此时procnum = 3 然后用kill 命令杀死进程之后
然后脚本检测到后,进而重启。这时server的进程号已经变化。这样server服务器的进程就完成的死亡重启的监控。
综合起来这句指令的意思就是:
以详细格式查看所有进程,从中选出具有关键字 Manipulator 的进程,但是排除掉用于查找的grep自身进程,对于满足上面条件的结果,统计其行数,也就是看有几个带有Manipulator关键字的进程,将统计的结果赋值给变量monitor 。
if…then…else…fi : shell脚本里面 if 语句的用法, fi 符号与 if 符号成对使用,表示 if 语句的结束。
if [ $monitor -eq 0 ] : if 语句的判断用 test 或者 “[ ]” ,符号” $“ 表示取变量的值, -eq表示等于, -gt大于, -lt小于, -ge大于等于,-le小于等于。
echo :用于输出显示。
用于运行Manipulator程序。
二、对使用python打开的多个程序的监控
因为知道自己想要监控的程序的具体名字,所以对于这一类程序的监控也可以用上面的方法,但是这一类情况也让我们思索另一种方法进行监控。
在我的 /home/mk90/Documents/restart_pro 文件夹里有 test.py 和 test2.py 两个python程序,现在我要看这两个程序是否已经打开,如果没有就打开它们。
multi_restart.sh
declare -a Array : 表示声明了一个数组 Array
这句指令包含的内容较多
pgrep 是通过程序的名字来查询进程的工具;
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,详细用法可以参考
https://blog.csdn.net/zhushuai1221/article/details/53114178
sed -n 1p : 的作用就是对前面查找的结果,读取第一行,同样 sed -n 2p 就是读取第二行 ;
awk '{print $1}’ : awk命令通常是将所列出的行,根据条件打印出某一列或几列,这里就是打印以空格为分隔符的第一列(其实也只有一列,因为pgrep命令只输出进程的pid号;
那么
两条指令的意思就是,查看名为python的进程,把查到的第一个进程的pid号赋值给Array[0],把第二个赋值给Array[1];
后面的判断就是只要有进程pid号,说明进程存在,否则进程不存在。
这句代码的意思就是打开一个新的终端,执行命令 ”python /home/mk90/Documents/restart_pro/test2.py“,执行完毕后该终端保持存在不关闭。
gnome-terminal 是终端的一种,Ubuntu系统的终端就是这种版本, 参数 -x 表示后面出现的都当做命令执行,并且只执行一次;
bash 是防止终端立即关闭,如果输入:
终端执行后会一闪就关闭,甚至看不到执行的效果;
"-c"选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令;
exec bash 使终端运行命令后仍然存在。
缺陷:
用这种方法有一个缺陷,就是需要知道会有几个python程序以及它们的的顺序;如果有两个的话,操作第二个是正常的,可以重启,但是如果第一个程序死了,也会重启第二个程序!!!因为第一个进程中断之后,系统实时监测,第二个进程变成了最前面的也是唯一的python进程,那么它认为第一个程序还在运行,而第二个程序停止了,所以会重启第二个程序。
总结;有什么问题和需要相关资料的都可以私信‘资料'两字可MF领取相关资料,C++、linux,shell,Kali,
首先明白一个前提,我们是发现问题才会告警发邮件通知,那么当告警脚本未加载时,说名当前监控项正常。或者之前出现异常,但是已经恢复。
脚本的目的是防止问题出现,处于修复期的频繁告警。我们可以定义一个时间阈值,一小时。比如距离上一次问题出现,也就是距离上一次告警的时间大于一小时,我们认为就是一个新的异常,否则就是一个尚未解决的故障。
每次告警,我们都记录一个绝对时间戳,当下一次告警到来时,用当前时间戳减去上一次报警的时间戳,然后if判断该差值,从而确定告警动作。
在具体脚本中定义t2为上一次告警时间戳,t1为当前时间戳,t1-t2就是我们要的判断值。t1可以用命令直接获取,t1=`date +%s` t2 要从日志中获取。但是还有一个问题,对于第一次告警,该t2从哪里来了,也简单,我们自己定义一个满足新异常条件的时间戳就可以,比如两小时之前。
对于一个已发现待解决的故障,也就是对应上面时间戳差值小于一小时的情况,如果我们的脚本是一分钟执行一次,就可以做一个计数器,每发现一次,计数一次,当计数器大于10时,也就是异常持续了10分钟,这时候发送邮件一次,同时清空计时器。
因为mail.py 脚本决定了发送邮件必须带三个参数,收件人邮箱,主题, 内容。因此mail.sh 调用mail.py 必须传递给它三个参数,那么这三个参数最终来自哪里呢,来自监控项脚本,比如load.sh
传递顺序为 load.sh---->mail.sh----->mail.py
再解释mail.sh 第一行,log=$1 , 是一个变量赋值语句,此时的$1就是load.sh 传递过来的邮箱名称。
在程序中我么看到后面将时间戳保存在了/tmp/$log 下面,该复制语句是为了给该日志文件取一个有意义的名称,便于以后管理。当然可以给出其他赋值,比如log=time.txt