[shell脚本]服务器性能监控

兔白白

前阵子,服务器突然就卡死了。不知道是什么原因
访问时,也不出现502,而是一直等待连接,直到超时
使用ssh连接也是如此

在云服务商那边查看监控,只能得知是cpu满了,具体什么原因 也不得而知
无奈只能重启服务器。
后来就一边问gpt 一边写了个ssh脚本, 放在服务器上,增加了一个定时任务
期望如果后续在出现死机的问题的话 能有所发现

system_status.sh 脚本如下:

#!/bin/bash  

# 用法
# 在定时任务脚本中 直接运行本脚本,即可完成对服务器的监控,达到预警值时会保存为日志中
# 在终端可以运行本脚本  并附加 system_status.sh show 的参数  即可直接输出监控数据

#cpu和内存 超标预警  百分比
CPU_THRESHOLD=60
MEM_THRESHOLD=60
# 预警日志存放目录
target_dir="/www/system_log"

# 获取当前时间  
current_time=$(date +"%Y-%m-%d %H:%M:%S")  
current_file=$(date +"%Y-%m-%d")  

# 检查目录是否存在
if [ ! -d "$target_dir" ]; then
    # 目录不存在,创建目录
    mkdir -p "$target_dir"
fi

# 获取总的 CPU 使用情况(用户 + 系统)  
cpu_usage() {  
  idle=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')  
  echo "$idle"  
}  

# 获取内存占用情况
mem_usageCount(){
      free_mem=$(free -m | awk 'NR==2{printf "%.2f", ($3-$4)*100/$2 }')  
  echo "$free_mem"  
}

# 获取总的内存使用情况  
mem_usage() {  
  free_mem=$(free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3-$4, $2, ($3-$4)*100/$2 }')  
  echo "$free_mem"  
}  

# 获取 CPU 占用最高的 5 个应用  
top_cpu_processes() {  
  echo "Top 5 CPU-consuming processes:"  
  ps -eo pid,cmd,%cpu,comm --sort=-%cpu | head -n 6  
}  

# 获取内存占用最高的 5 个应用  
top_mem_processes() {  
  echo "Top 5 Memory-consuming processes:"  
  ps -eo pid,cmd,%mem,comm --sort=-%mem | head -n 6  
}  

show_about(){
    # 输出系统状态  
    echo "Time: $current_time"  
    echo "CPU Usage: $cpu_usg%"  
    echo uptime | awk '{print $6,$7,$8,$9,$10}'
    mem_usage  

    echo "======================================"  
    top_cpu_processes  

    echo "======================================"  
    top_mem_processes  

    echo "======================================"
    echo
}

#当前cpu 占用情况
cpu_usg=$(cpu_usage)
# 当前内存占用情况
mem_usg=$(mem_usageCount)

# 如果 cpu 达到阈值
if awk "BEGIN { exit ($cpu_usg > $CPU_THRESHOLD || $mem_usg > $MEM_THRESHOLD ) ? 0 : 1 }"; then  
  show_about >> $target_dir/$current_file.log
fi

# 如果有附加参数  则直接输出当前脚本监控
if [ "$1" = "show" ]; then
    show_about
fi

可以在命令行中 直接使用 system_status.sh show 来查看脚本的输出效果
也可以将脚本添加到定时任务中 每10秒 或者 1分钟 执行一次
如果cpu或者内存 达到预警值时
就会将结果 输出到日志中。 方便后续来查看问题
在定时任务进行监控时 不需要 show 的参数。

日志会输出 cpu,负载,内存的百分比数值 以及 top5的应用

实际上 还可以完善一下 增加 对负载的监控, 看了下相关的资料。
当5分钟负载低于 0.7*CPU核心数时,就属于正常情况,如果是超出了 就是属于需要关注的状态
不过 shell 脚本实在是不熟悉, 没法搞细致的操作了。后续有时间的话 准备整个插件出来
不过 这就需要 解除 shell_exec 函数的限制, 害。貌似也不方便。

219 0 2
0个评论

兔白白

1000
积分
0
获赞数
0
粉丝数
2024-04-18 加入
×
🔝