前阵子,服务器突然就卡死了。不知道是什么原因
访问时,也不出现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 函数的限制, 害。貌似也不方便。