编写简单的shell脚本,监控主机服务
最近在抽空学习shell脚本,学习完正好写篇文章自我复习。
编写监测主机状态脚本
#!/bin/bash#监控目标主机状态#监控方法 ping ICMP协议#ping 通 host up#ping 不通 host down#1、关于禁ping 防止DDOS# 禁的是陌生人 # 网络有延迟 假报警问题# ping的取值 报警阈值 # ping的频率 秒级 5秒 or 1秒#调用方式(可执行情况) sh host_status.sh host(主机ip)#main#也可以写成函数去封装方法for ((i=1;i<4;i++));do#执行三次,每次发送一条ping到对应主机,成功则设置参数为1#输出信息丢入/dev/null(linux的垃圾桶),$1代表ip参数 if ping -c1 $1 &>/dev/null;then#成功,则设置全局变量ping_count + i为1 export ping_count"$i"=1 else#否则为0 export ping_count"$i"=0 fi#时间间隔 0.3代表一秒三次 sleep 0.3done#3次ping失败报警 eq代表相等if [ $ping_count1 -eq $ping_count2 ] && [ $ping_count2 -eq $ping_count3 ] && [ $ping_count1 -eq 0 ];then#ping不通echo "$1 is down"#ping通else echo "$1 is up"fi#取消设置的全局变量unset ping_count1unset ping_count2unset ping_count3
记得取消脚本中设置的全局变量
可以看到ping域名也是一样的,有dns解析即可。
编写监测端口服务脚本
一般我们使用 lsof -i : port 或者 netstat -an | grep port的形势来查看端口服务,或者使用service/systemctl直接查看服务。对于本机这样确实较为方便,但是对于某些服务可能处于假死状态(流量太大),这样就会导致错认为端口服务被关闭。这时可以采用telnet来查看端口。
注 若本机未安装telnet服务 可以使用yum/apt 来快速安装, telnet使用方法:telnet host port
#!/bin/bash#监控一个服务端口#监控方法#1) 通过systemctl service 服务启动状态#2) lsof 查看端口是否存在#3) 查看进程是否存在######服务假死 压力过大 | 服务down了#4) 测试端口是否有响应 推荐 #telnet 协议#mainport_status () {#mktemp创建随机后缀临时文件,执行完rm -f删除temp_file=`mktemp port_status.XXX`# 判断本机的telnet是否存在[ ! -x /usr/bin/telnet ]&&echo "telnet not fount command" && exit 1# 测试端口 $1 IP $2 port3( telnet $1 $2 <quitEOF) &>$temp_file#分析文件中的内容,判断结果 \是转义符,\^]即是匹配^]的意思if egrep "\^]" $temp_file &>/dev/null;then echo "$1 $2 is open"else echo "$1 $2 is close"fi#删除临时文件rm -f $temp_file}port_status $1 $2
查看内存和cpu使用率
一般linux中安装htop来查看服务,不过脚本配合top当然也能快速执行来简单查看。
#!/bin/bash#采用函数的方式编写方法,便于复用memory(){#创建临时文件 注意`号temp_file=`mktemp memory.XXX`#使用top将进程信息装入临时文件top -b -n 1 > $temp_fileecho "memory status:" #tail + awk + sort + head 多个管道命令输出到控制台#tail -n +8 查看第八行至末尾#awk输出每一行 sort进行排序 然后head取前十tail -n +8 $temp_file | awk '{array[$NF]+=$6}END{for (i in array) print array[i],i}' |sort -k 1 -n -r|head -10rm -f $temp_file}#同内存cpu(){temp_file=`mktemp memory.XXX`top -b -n 1 > $temp_fileecho "cpu status:"tail -n +8 $temp_file | awk '{array[$NF]+=$9}END{for (i in array) print array[i],i}' |sort -k 1 -n -r|head -10rm -f $temp_file}memorycpu
查看内存使用率
原理其实也就是去进程文件夹/proc/meminfo查看信息,其实也应了那句linux中一切皆文件的话,每个进程都有自己的pid文件
#!/bin/bash#内存使用率统计脚本#/proc/meminfo#内存申请顺序 free-cache-buffer-swapmemory_use() {#head + awk 解决 awk中是'' 命令执行是``,需要划清memory_used=`head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print(t-f)*100/t}'`memory_cache=`head -5 /proc/meminfo |awk 'NR==1{t=$2}NR==4{c=$2;print c*100/t"%"}'`memory_buffer=`head -4 /proc/meminfo |awk 'NR==1{t=$2}NR==3{b=$2;print b*100/t"%"}'`echo -e "memory_used:$memory_used\tbuffer:$memory_buffer\tcached:$memory_cache"}memory_use
个人感觉内存吃率和htop查看的有点点出入,不知道是什么原因,还有待学习。
io监控脚本
可以通过查看io,监控磁盘读写状态。
先使用下iostat看看:
io(){ device_num=`iostat -x 1 3|egrep "^vd[a-z]"|wc -l` iostat -x 1 3|egrep "vda"|tail -n +$((device_num+1))| awk '{io_long[$1]+=$9}END{for (i in io_long)print io_long[i],i}'# 2-3算高阈值}#以下可以用来测试io队列while truedo io sleep 5done
可以通过使用dd命令模拟测试io
看得出,磁盘块VDA的io率飙升。