侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

设计一个进程资源监控脚本

2025-12-12 / 0 评论 / 4 阅读

题目

设计一个进程资源监控脚本

信息

  • 类型:问答
  • 难度:⭐⭐

考点

进程监控,资源阈值判断,邮件告警,脚本健壮性

快速回答

实现一个监控指定进程CPU/内存使用率的Shell脚本,当超过阈值时发送告警邮件:

  • 使用pstop获取进程资源数据
  • 设置CPU和内存的双重阈值判断
  • 通过mail命令发送告警邮件
  • 添加参数校验和错误处理机制
  • 使用crontab定时执行
## 解析

问题场景

在生产环境中,关键进程的资源异常可能导致服务中断。本脚本需实时监控指定进程的CPU和内存使用率,在超过阈值时自动触发告警。

核心实现方案

#!/bin/bash

# 配置参数
PROCESS_NAME="nginx"
CPU_THRESHOLD=80   # CPU使用率阈值(%)
MEM_THRESHOLD=70   # 内存使用率阈值(%)
EMAIL="admin@example.com"

# 获取进程资源使用率
pid=$(pgrep -o $PROCESS_NAME)
if [ -z "$pid" ]; then
  echo "错误: 进程 $PROCESS_NAME 未找到" | mail -s "进程监控告警" $EMAIL
  exit 1
fi

# 使用ps获取CPU和内存数据
usage=$(ps -p $pid -o %cpu,%mem --no-headers)
cpu_usage=$(echo $usage | awk '{print $1}')
mem_usage=$(echo $usage | awk '{print $2}')

# 浮点数比较函数
compare_floats() {
  awk -v n1="$1" -v n2="$2" 'BEGIN {if (n1+0 > n2+0) exit 0; exit 1}'
}

# 阈值判断与告警
if compare_floats $cpu_usage $CPU_THRESHOLD || compare_floats $mem_usage $MEM_THRESHOLD; then
  echo "警告: 进程 $PROCESS_NAME (PID:$pid) 资源超标" > /tmp/alert.txt
  echo "CPU使用率: ${cpu_usage}% (阈值: ${CPU_THRESHOLD}%)" >> /tmp/alert.txt
  echo "内存使用率: ${mem_usage}% (阈值: ${MEM_THRESHOLD}%)" >> /tmp/alert.txt
  mail -s "资源监控告警" $EMAIL < /tmp/alert.txt
fi

关键考点解析

  • 进程监控:使用pgrep获取PID,ps -p精准定位进程资源数据
  • 阈值判断:通过awk实现浮点数比较,支持小数阈值
  • 邮件告警:使用系统mail命令,邮件内容包含详细监控数据
  • 健壮性设计
    • 进程不存在时的错误处理
    • 使用临时文件避免邮件内容截断
    • 返回码检查(示例中省略,实际需添加)

最佳实践

  • 定时任务配置:通过crontab -e添加定时执行(每5分钟):
    */5 * * * * /path/to/monitor.sh
  • 参数化改造:可通过命令行参数传递进程名和阈值:
    ./monitor.sh -p java -c 90 -m 80
  • 性能优化:避免频繁创建进程,使用top -b -n1 -p $pid批量获取数据

常见错误

  • ❌ 直接使用整数比较:[ $cpu_usage -gt $CPU_THRESHOLD ](不支持小数)
  • ❌ 未处理多实例进程:当存在多个同名进程时需循环处理所有PID
  • ❌ 邮件未配置:需提前安装mailutils并配置SMTP
  • ❌ 权限问题:crontab执行环境缺少PATH变量,建议脚本中设置绝对路径

扩展知识

  • 监控增强:添加连续超阈值检测(如连续3次超标才告警)
  • 多通知渠道:集成企业微信/钉钉机器人API
  • 资源类型扩展:监控线程数、文件描述符等指标
  • 替代方案:专业监控工具(Prometheus+Grafana)更适合复杂场景