shell 监控cpu,memory,load average

2023-05-16

shell 监控cpu,memory,load average,记录到log,当负载压力时,发电邮通知管理员。

原理:

1.获取cpu,memory,load average的数值

2.判断数值是否超过自定义的范围,例如(CPU>90%,Memory<10%,load average>2)

3.如数值超过范围,发送电邮通知管理员。发送有时间间隔,每小时只会发送一次。

4.将数值写入log。

5.设置crontab 每30秒运行一次。


ServerMonitor.sh

#!/bin/bash

# 系统监控,记录cpu、memory、load average,当超过规定数值时发电邮通知管理员

# *** config start ***

# 当前目录路径
ROOT=$(cd "$(dirname "$0")"; pwd)

# 当前服务器名
HOST=$(hostname)

# log 文件路径
CPU_LOG="${ROOT}/logs/cpu.log"
MEM_LOG="${ROOT}/logs/mem.log"
LOAD_LOG="${ROOT}/logs/load.log"

# 通知电邮列表
NOTICE_EMAIL='admin@admin.com'

# cpu,memory,load average 记录上一次发送通知电邮时间
CPU_REMARK='/tmp/servermonitor_cpu.remark'
MEM_REMARK='/tmp/servermonitor_mem.remark'
LOAD_REMARK='/tmp/servermonitor_loadaverage.remark'

# 发通知电邮间隔时间
REMARK_EXPIRE=3600
NOW=$(date +%s)

# *** config end ***


# *** function start ***

# 获取CPU占用
function GetCpu() {
    cpufree=$(vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}')
    cpuused=$((100 - $cpufree))
    echo $cpuused

    local remark
    remark=$(GetRemark ${CPU_REMARK})

    # 检查CPU占用是否超过90%
    if [ "$remark" = "" ] && [ "$cpuused" -gt 90 ]; then
        echo "Subject: ${HOST} CPU uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
        echo "$(date +%s)" > "$CPU_REMARK"
    fi
}

# 获取内存使用情况
function GetMem() {
    mem=$(free -m | sed -n '3,3p')
    used=$(echo $mem | awk -F ' ' '{print $3}')
    free=$(echo $mem | awk -F ' ' '{print $4}')
    total=$(($used + $free))
    limit=$(($total/10))
    echo "${total} ${used} ${free}"

    local remark
    remark=$(GetRemark ${MEM_REMARK})

    # 检查内存占用是否超过90%
    if [ "$remark" = "" ] && [ "$limit" -gt "$free" ]; then
        echo "Subject: ${HOST} Memory uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
        echo "$(date +%s)" > "$MEM_REMARK"
    fi
}

# 获取load average
function GetLoad() {
    load=$(uptime | awk -F 'load average: ' '{print $2}')
    m1=$(echo $load | awk -F ', ' '{print $1}')
    m5=$(echo $load | awk -F ', ' '{print $2}')
    m15=$(echo $load | awk -F ', ' '{print $3}')
    echo "${m1} ${m5} ${m15}"

    m1u=$(echo $m1 | awk -F '.' '{print $1}')

    local remark
    remark=$(GetRemark ${LOAD_REMARK})

    # 检查是否负载是否有压力
    if [ "$remark" = "" ] && [ "$m1u" -gt "2" ]; then
        echo "Subject: ${HOST} Load Average more than 2 $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
        echo "$(date +%s)" > "$LOAD_REMARK"
    fi
}

# 获取上一次发送电邮时间
function GetRemark() {
    local remark

    if [ -f "$1" ] && [ -s "$1" ]; then
        remark=$(cat $1)

        if [ $(( $NOW - $remark )) -gt "$REMARK_EXPIRE" ]; then
            rm -f $1
            remark=""
        fi
    else
        remark=""
    fi

    echo $remark
}


# *** function end ***

cpuinfo=$(GetCpu)
meminfo=$(GetMem)
loadinfo=$(GetLoad)

echo "cpu: ${cpuinfo}" >> "${CPU_LOG}"
echo "mem: ${meminfo}" >> "${MEM_LOG}"
echo "load: ${loadinfo}" >> "${LOAD_LOG}"

exit 0

crontab

* * * * * /home/xxxx/ServerMonitor.sh
* * * * * sleep 30; /home/xxxx/ServerMonitor.sh


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 监控cpu,memory,load average 的相关文章

  • 在 unix bash 脚本中可以嵌套 Here Document 吗?

    是否可以在另一个heredoc中编写一个heredoc ssh T q yxz server1 lt lt END TEXT ssh T q abc server2 lt lt SUB TEXT SUB TEXT END TEXT Yes
  • 如何在shell脚本中读取单个字符

    我想要类似的选项getche 如何从命令行读取单个字符输入 Using read命令我们可以做到吗 在巴什中 read可以做到 read n1 ans
  • C# 中的字符串常量内存池

    大家都知道 Net框架中String对象是直接存储在堆内存中的 我只是想了解 Net 框架中是否为字符串保留了内存 在java中 有一个为字符串保留的内存 称为SCMP 字符串常量内存池 字符串在其中像堆内存中的其他对象一样被初始化和垃圾收
  • 从 Java 内部限制 CPU

    我在这个 和其他 论坛中看到了许多具有相同标题的问题 但似乎没有一个问题能完全解决我的问题 就是这个 我有一个 JVM 它占用了托管它的机器上的所有 CPU 我想限制它 但是我不能依赖任何限制工具 技术external到 Java 因为我无
  • PHP 中是否有相当于 subprocess 的东西?

    在 Java 和 Python 中 你有ProcessBuilder or 子流程 https docs python org 2 library subprocess html可让您使用未转义字符串轻松启动进程的模块 例如 ls some
  • 为什么连接终止

    我正在尝试使用随机森林分类模型H2OR 内部的库 训练集有 7000 万行和 25 个数字特征 总文件大小为 5 6 GB 验证文件的大小为 1 GB 我的系统有 16 GB RAM 和 8 核 CPU 系统成功读取 H2O 对象中的两个文
  • 如何使用 echo 命令写入并附加到文件

    我正在尝试编写一个脚本 它将使用 echo 并写入 附加到文件 但我的语法中已经有了 字符串 说 echo I am Finding difficult to write this to file gt file txt echo I ca
  • Linux find 命令权限被拒绝

    我想过滤掉不必要的信息 权限被拒绝 这些是命令 的输出find type f name sources list find run lxcfs Permission denied find run sudo Permission denie
  • 如何计算大型数据集的平均值

    我正在使用一个数据集 该数据集每天 24 小时每小时读取一次温度读数 已有 100 多年的历史 我想获得每天的平均温度以减少数据集的大小 标题看起来像这样 YR MO DA HR MN TEMP 1943 6 19 10 0 73 1943
  • 如何 grep 文件中不区分大小写的字符串?

    我有一个文件file1其结尾为Success OR success 我想要grep为了这个词success以一种不区分大小写的方式 我写了以下命令 但它区分大小写 cat file1 grep success 我怎样才能改变它 以便它ret
  • Linux shell 根据第二列对文件进行排序?

    我有一个这样的文件 FirstName FamilyName Address PhoneNumber 如何按 FamilyName 排序 如果这是 UNIX sort k 2 file txt 您可以使用多个 k用于对多列进行排序的标志 例
  • C# 应用程序可以使用多少 RAM? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • Python 脚本:每次打印新行到 shell,而不是更新现有行

    说到Python 我是个菜鸟 我有一个 python 脚本 它给我这样的输出 last ZVZX W3vo9I Downloading video webpage last ZVZX W3vo9I Extracting video info
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public

随机推荐

  • Rsync 安装与使用

    Rsync 是一个远程数据同步工具 xff0c 可以通过 LAN WAN 快速同步多台主机间的文件 Rsync 使用 34 Rsync演算法 34 来使本地和远程两个主机之间的文件同步 这个算法只传送两个文件的不同部分 xff0c 而不是每
  • php 字符串压缩方法比较

    php 提供的字符串压缩方法有 1 gzcompress Compress a string This function compress the given string using the ZLIB data format 2 gzen
  • php 生成短网址

    php 生成短网址 原理 xff1a 1 将原网址做crc32校验 xff0c 得到校验码 2 使用sprintf 39 u 39 将校验码转为无符号数字 3 对无符号数字进行求余62操作 xff08 大小写字母 43 数字等于62位 xf
  • debian7安装和配置小经验

    好久没碰linux了 xff0c 这回 捡 了台电脑测试玩 xff0c 发现过去的基本都忘记了 xff0c 拳不离手 曲不离口 xff0c 古人诚吾不欺 linux版本选择我比较熟悉debian xff0c 因为debian装包好方便 xf
  • ApacheBench 测试性能并使用GnuPlot绘制图表

    Apache Bench 是web性能测试工具 xff0c 功能强大 但输出的结果只是数字形式 xff0c 不容易看到数据的变化 因此 xff0c GnuPlot 的强大绘制功能正好可以弥补Apache Bench这方面的不足 关于Apac
  • VM ubuntu ping unknow host 解决方法

    例如网关地址为 xff1a 192 168 1 1 route add default gw 192 168 1 1 sudo vim etc resolv conf 在 etc resolv conf 中加入 Generated by N
  • apache日志分析及系统cpu,内存,负载情况监控

    1 根据Apache Log xff0c 获取当天秒并发数最多的记录 tail 10000 demo fdipzone com access log 2014 01 16 01 cut d 34 34 f 2 awk 39 print 1
  • Apache 搭建HTTPS Virtual Host

    Apache 搭建HTTPS Virtual Host 1 创建SSL证书 首先需要安装openssl xff0c linux系统默认已安装 xff0c 如没有则用以下命令安装 xff1a sudo apt get install open
  • MongoDB 主从同步设置

    MongoDB 主从同步设置 关于MongoDB的安装及启动参数说明可以参考我之前转载的 Ubuntu安装MongoDB 与 Mongodb启动命令mongod参数说明 主从设置 Master xff1a 192 168 111 103 P
  • php Timer 页面运行时间监测类

    php Timer 页面运行时间监测类 xff0c 可按不同key监测不同的运行时间 Timer class php lt php Timer class 计算页面运行时间 可按不同key计算不同的运行时间 Date 2014 02 28
  • C 使用异或(xor)加密/解密文件

    C 使用异或 XOR 加密 解密文件 之前写过一篇 php 使用异或 xff08 XOR xff09 加密 解密文件 xff0c 但php执行的速度很慢 xff0c 因此这次使用C重写 xff0c 速度有很大的提高 xor encrypt
  • 使用C创建php扩展

    使用C创建php扩展 优点 xff1a 1 提高运行效率 2 降低php复杂度 xff0c 可以直接调用扩展方法实现功能 3 方便与第三方库交互 缺点 xff1a 1 开发比php复杂 2 可维护性降低 3 开发周期变长 php开发 xff
  • linux 系统监控命令

    linux系统监控有以下命令 xff1a uptime xff1a 显示系统负载情况 mpstat xff1a 显示 CPU 性能 free xff1a 显示内存使用情况 vmstat xff1a 显示虚拟内存使用情况 iostat xff
  • php 构造函数支持不同个数参数的方法

    php 构造函数支持不同个数参数方法 原理 xff1a 在 construct中使用 func num args 获取参数个数 xff0c 再根据参数个数执行不同的调用 参数值使用func get arg 方法获得 demo xff1a l
  • A+B for Polynomials(c++)

    题目描述 xff1a This time you are supposed to find A 43 B where A and B are two polynomials 输入描述 xff1a Each input file contai
  • php soap 使用实例

    SOAP 是基于XML和HTTP通讯协议 xff0c XML各个平台 xff0c 各种语言都支持的一种语言 WSDL 是网络服务描述语言 xff08 Web Services Description Language xff09 xff0c
  • 使用PDO查询mysql避免SQL注入

    使用传统的 mysql connect mysql query方法来连接查询数据库时 xff0c 如果过滤不严紧 xff0c 就有SQL注入风险 虽然可以用mysql real escape string 函数过滤用户提交的值 xff0c
  • linux crontab 实现每秒执行

    linux crontab 命令 xff0c 最小的执行时间是一分钟 如需要在小于一分钟内重复执行 xff0c 可以有两个方法实现 1 使用延时来实现每N秒执行 创建一个php做执行动作 xff0c 非常简单 xff0c 就是把当前时间写入
  • ssh远程执行命令并自动退出

    ssh命令格式如下 xff1a usage ssh 1246AaCfgKkMNnqsTtVvXxYy b bind address c cipher spec D bind address port e escape char F conf
  • shell 监控cpu,memory,load average

    shell 监控cpu xff0c memory xff0c load average xff0c 记录到log xff0c 当负载压力时 xff0c 发电邮通知管理员 原理 xff1a 1 获取cpu xff0c memory xff0c