3天玩转shell--11.实战编写服务器资源告警脚本

简介: 本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。

一、功能介绍:

【1】统计负载、内存、磁盘、swap使用率,
【2】统计连接数、流量、并根据使用情况发邮件告警

二、通过代码学习

本节是通过编写一段简单资源统计告警代码来加深对shel编程的。可以通过执行、调试这段脚本来加深知识点。
#!/bin/bash
#11.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH

#定义变量
HostName=$(hostname -s)
IP=$(ifconfig | awk '/inet /{sub(/addr:/,"",$2);print $2}')
NOTICE_MAIL="aa@bb.com"  #多个邮箱逗号隔开
mail_content="/tmp/.alarm.info"

#初始化配置邮件发送的信息
init(){
   which mail >/dev/null
   if [ $? -ne 0 ];then
      yum -y install mailx
   fi
   if [ -s /etc/mail.rc ];then
      grep "set smtp-auth-user=" /etc/mail.rc >/dev/null
      if [ $? -ne 0 ];then
         cat >> /etc/mail.rc << EOF
set from=user@163.com
set smtp=smtp.163.com
set smtp-auth-user=user@163.com
set smtp-auth-password=password
set smtp-auth=login
EOF
      fi
   fi
}

#邮件发送函数
AlarmNotice(){
    Mail_Title="[WARN] $HostName[$IP]Server performance alarm"
    mail -s "$Mail_Title"  "$NOTICE_MAIL" < $mail_content
}

CollectSysinfo(){
    #获取当前系统时间
    Htime=$(date +"%Y-%m-%dT%H:%M:%S%z")
    Timestamp=$(date +%s000)

    #读取系统负载
    Load=$(uptime | awk 'NR==1{gsub(/,/,"");print $(NF-2)}')

    #读取swap使用率
    SwapUsed=$(free | awk '/Swap/&&0!~$2{printf("%.3f\n",($3/$2))}')

    #读取内存使用率
    MemUsed=$(free -m|awk '/Mem/{printf("%.3f\n",($2-$7)/$2)}')

    #读取磁盘使用率
    DiskUsed=$(df -P | sed "1d"|awk 'gsub(/%/,""){print $(NF-1)/100}'|sort -r|head -1)
    TcpConn=$(ss -s|awk '/TCP:/{print $2}')

    #获取网卡流量
    sar -n DEV 1 5 >/tmp/.sarDEV.txt
    grep "xkB/s" /tmp/.sarDEV.txt >/dev/null
    if [ $? -eq 0 ];then
       Trafficin=$(cat /tmp/.sarDEV.txt|awk '/Average/&&/eth0/{printf("%.2f",$5*8/1024)}')
       Trafficout=$(cat /tmp/.sarDEV.txt|awk '/Average/&&/eth0/{printf("%.2f",$6*8/1024)}')
    else
       Trafficin=$(cat /tmp/.sarDEV.txt|awk '/Average/&&/eth0/{printf("%.2f",$5*8/1024/1024)}')
       Trafficout=$(cat /tmp/.sarDEV.txt|awk '/Average/&&/eth0/{printf("%.2f",$6*8/1024/1024)}')
    fi

    #将采集数据通过cur,以useragent的形式传到接收端。接收端做法很简单,只需要打开nginx日志,然后nginx日志的格式只配置一个useragent的字段,这样就会将正行json格式记录了,参考配置:   #log_format  jsonlog escape=json '$http_user_agent';
#access_log logs/access_alarm.log jsonlog;

    postData="{\"server\":\"$IP\",\"load\":$Load,\"swap\":$SwapUsed,\"mem\":$MemUsed,\"disk\":$DiskUsed,\"tcpconn\":$TcpConn,\"trafficin\":$Trafficin,\"trafficout\":$Trafficout,\"timestamp\":$Timestamp,
\"htime\":\"$Htime\"}"
    curl -A "${postData}" -s --connect-timeout 5 --max-time 10 "${nodeperfApi}"

    #告警判断
    A_Load=$(echo "$Load"|awk '$1>15{printf "Load:%d\n",$1}')   #负载大于15进行告警
    A_MemUsed=$(echo "$MemUsed"|awk '$1>0.85{printf "MemUsed:%.3f\n",$1}')  #内存使用率大于85%开始告警
    A_SwapUsed=$(echo "$SwapUsed"|awk '$1>0.85{printf "SwapUsed:%.3f\n",$1}')  #swap使用率大于85%开始告警
    A_DiskUsed=$(echo "$DiskUsed"|awk '$1>0.9{printf "DiskUsed:%.3f\n",$1}')   #磁盘使用率大于90%开始告警

    echo -e "$A_Load $A_MemUsed $A_SwapUsed $A_DiskUsed" >$mail_content #将超出阀值的信息导出到临时文件

    egrep "[A-Za-z0-9]" $mail_content >/dev/null
    if [ $? -eq 0 ];then   #判断导出的临时文件是否不为空
       lastrunt=$(head -1 /tmp/nodealarm.tag)
       ttimes=$(( 10#${Timestamp:0:10} - 10#$lastrunt ))
       if [[ 10#$ttimes -gt 600 ]];then  #判断距离上一次告警是否超过10分钟,超过之后才进行告警。
          AlarmNotice
          echo "${Timestamp:0:10}" >/tmp/nodealarm.tag
       fi
       echo "$Htime $alarmctx" >>/tmp/run.debug.log  #将告警信息打印与本地日志
       rm -f $mail_content
    fi
}

init
CollectSysinfo
相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
86 1
|
29天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
53 2
6种方法打造出色的Shell脚本
|
2月前
|
机器学习/深度学习 弹性计算 运维
云计算系列之阿里云ECS服务器管理实战
本文档介绍了阿里云ECS(Elastic Compute Service)的基本概念、实例管理、磁盘操作、快照与镜像功能及其应用场景,最后通过具体案例解析ECS的实际应用。ECS是阿里云提供的高效、可靠的云计算服务,支持多种业务需求,如Web应用、高并发网站、数据库等,帮助企业快速构建稳定安全的应用,提升运维效率,降低IT成本。文档还详细说明了ECS实例的创建方式、连接方法及日常管理操作,帮助用户更好地利用ECS服务。
71 2
云计算系列之阿里云ECS服务器管理实战
|
15天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
43 1
|
20天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
40 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
49 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
45 1
|
2月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
72 4
|
2月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
58 3