#!/usr/bin/env bash

# 设置告警阈值 默认80%
threshold=${1:-80}

while true
do
    check_time=$(date '+%Y-%m-%d %H.%M.%S')
    cpu_usage=$(top -bn 1 | awk '/%Cpu\(s\)/{printf "%.0f", $2+$4}')
    if [ "${cpu_usage}" -gt "${threshold}" ]; then
        echo "${check_time} cpu usage: ${cpu_usage}%"
    fi
    sleep 5
done
  1. 设置告警阈值
  • 脚本首先定义了一个变量 threshold,用于存储CPU使用率的告警阈值。默认情况下,如果用户没有提供命令行参数,阈值将设置为 80%。若用户在运行脚本时传入一个整数作为参数(例如:./script.sh 90),则阈值将使用该参数值(例如:90%)。
  1. 无限循环
  • 使用 while true 创建一个无限循环,使脚本持续运行并定期检查CPU使用率。
  1. 获取当前时间和CPU使用率
  • 在循环内部:
  • 使用 date 命令获取当前时间,并以 '%Y-%m-%d %H.%M.%S' 格式赋值给 check_time 变量。
  • 使用 top 命令(配合 -bn 1 参数以非交互模式输出一次统计信息)结合 awk 命令提取总的CPU使用率(用户+系统),并赋值给 cpu_usage 变量。具体来说:
  • top -bn 1 输出一次系统的实时资源使用情况。
  • awk '/%Cpu\(s\)/{printf "%.0f", $2+$4}' 从 top 的输出中找到包含 %Cpu(s) 的行(即CPU使用率总览行),计算第2个字段(用户CPU使用率)与第4个字段(系统CPU使用率)之和,并将结果四舍五入至整数,以百分比形式输出。
  1. 判断与告警
  • 使用条件判断语句 [ "${cpu_usage}" -gt "${threshold}" ] 检查当前CPU使用率是否超过设定的阈值。如果是:
  • 使用 echo 命令输出告警信息,内容包括当前时间(check_time)和超过阈值的CPU使用率(cpu_usage)。
  1. 休眠
  • 在每次循环结束时,使用 sleep 5 命令让脚本暂停执行5秒钟。这使得脚本每隔5秒检查一次CPU使用率,避免过于频繁地检查和输出。