服务器测评网
我们一直在努力

Linux 进程监控脚本如何实现实时告警与日志记录?

在Linux系统中,进程是程序执行的基本单元,监控进程的运行状态对于系统稳定性、性能优化和故障排查至关重要,通过编写进程监控脚本,管理员可以实时掌握进程的存活情况、资源占用、异常行为等,及时采取应对措施,本文将详细介绍Linux进程监控脚本的编写方法、常用技术及实用案例。

Linux 进程监控脚本如何实现实时告警与日志记录?

进程监控的核心目标

进程监控的核心目标包括:确保关键进程持续运行(如Web服务、数据库服务)、检测进程资源占用(CPU、内存)是否异常、识别僵尸进程或僵死线程,以及记录进程的启停时间与错误日志,这些目标能帮助管理员主动发现系统问题,避免服务中断或性能瓶颈。

监控脚本的实现基础

进程状态查询命令

Linux提供了多种命令查询进程信息,ps命令是最常用的工具之一。ps -ef显示所有进程的详细信息,ps -aux按用户 CPU 占比排序;pgrep命令可根据进程名或PID筛选进程,如pgrep -f nginx返回所有nginx进程的PID。tophtop可实时动态展示进程资源占用,适合交互式监控。

进程状态标识

进程状态(STAT)是监控的关键指标,常见状态包括:

  • R(运行):进程正在运行或就绪;
  • S(睡眠):进程等待事件完成;
  • D(不可中断睡眠):通常等待I/O操作,需手动干预;
  • Z(僵尸):进程已终止但父进程未回收,需重点关注;
  • T(停止):进程被暂停或 traced。

脚本中可通过ps -p <PID> -o stat=获取进程状态,判断是否异常。

Linux 进程监控脚本如何实现实时告警与日志记录?

基础进程监控脚本示例

以下是一个简单但实用的进程监控脚本,核心功能是检测关键进程是否存在,若不存在则自动重启并记录日志。

#!/bin/bash
# 定义需要监控的进程名
PROCESS_NAME="nginx"
LOG_FILE="/var/log/process_monitor.log"
RESTART_CMD="systemctl restart nginx"
# 检查进程是否存在
check_process() {
    if pgrep -f "$PROCESS_NAME" > /dev/null; then
        return 0  # 进程存在
    else
        return 1  # 进程不存在
    fi
}
# 记录日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 主监控逻辑
main() {
    if check_process; then
        log_message "$PROCESS_NAME is running."
    else
        log_message "Error: $PROCESS_NAME is not running. Attempting to restart..."
        $RESTART_CMD
        if check_process; then
            log_message "$PROCESS_NAME restarted successfully."
        else
            log_message "Failed to restart $PROCESS_NAME. Manual intervention required."
        fi
    fi
}
# 执行监控
main

脚本说明:

  • 进程检测:使用pgrep -f匹配进程名,避免误判(如进程名包含子字符串)。
  • 日志记录:将监控结果写入日志文件,便于后续审计。
  • 自动重启:通过systemctlservice命令重启服务,适用于systemd管理的服务。

可将脚本加入crontab,每5分钟执行一次:*/5 * * * * /path/to/process_monitor.sh

高级监控:资源占用与异常检测

基础监控仅关注进程存活,实际场景中还需监控资源占用和异常行为,以下脚本扩展了CPU、内存占用检测,并支持阈值告警。

#!/bin/bash
PROCESS_NAME="mysql"
CPU_THRESHOLD=80  # CPU使用率阈值(%)
MEM_THRESHOLD=90  # 内存使用率阈值(%)
LOG_FILE="/var/log/process_monitor_resource.log"
# 获取进程PID
PID=$(pgrep -f "$PROCESS_NAME")
if [ -z "$PID" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: $PROCESS_NAME not running." >> "$LOG_FILE"
    exit 1
fi
# 获取CPU和内存使用率
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{printf "%.0f", $1}')
MEM_USAGE=$(ps -p "$PID" -o %mem --no-headers | awk '{printf "%.0f", $1}')
# 检查资源占用
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME CPU usage is ${CPU_USAGE}% (threshold: ${CPU_THRESHOLD}%)." >> "$LOG_FILE"
fi
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME memory usage is ${MEM_USAGE}% (threshold: ${MEM_THRESHOLD}%)." >> "$LOG_FILE"
fi
# 检查僵尸进程
if ps -p "$PID" -o stat= | grep -q "Z"; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Critical: $PROCESS_NAME is in zombie state." >> "$LOG_FILE"
    kill -9 "$PID"  # 强制终止僵尸进程
fi

功能扩展:

  • 资源阈值告警:当CPU或内存占用超过阈值时,记录警告日志。
  • 僵尸进程处理:通过stat字段检测僵尸进程并强制终止,避免资源泄漏。
  • 动态阈值:可根据服务器配置调整阈值,例如高内存服务器可适当放宽内存限制。

多进程监控与集群管理

在生产环境中,需同时监控多个进程(如Nginx、MySQL、Redis),可通过数组或配置文件管理进程列表,实现批量监控。

Linux 进程监控脚本如何实现实时告警与日志记录?

#!/bin/bash
# 进程列表配置(格式:进程名|重启命令|CPU阈值|内存阈值)
PROCESSES=(
    "nginx|systemctl restart nginx|80|90"
    "mysql|systemctl restart mysql|85|95"
    "redis|systemctl restart redis|70|85"
)
LOG_FILE="/var/log/multi_process_monitor.log"
monitor_process() {
    local process_info=($1)
    PROCESS_NAME="${process_info[0]}"
    RESTART_CMD="${process_info[1]}"
    CPU_THRESHOLD="${process_info[2]}"
    MEM_THRESHOLD="${process_info[3]}"
    PID=$(pgrep -f "$PROCESS_NAME")
    if [ -z "$PID" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error: $PROCESS_NAME not running. Restarting..." >> "$LOG_FILE"
        $RESTART_CMD
        return
    fi
    CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{printf "%.0f", $1}')
    MEM_USAGE=$(ps -p "$PID" -o %mem --no-headers | awk '{printf "%.0f", $1}')
    if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ] || [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Warning: $PROCESS_NAME resources exceeded (CPU: ${CPU_USAGE}%, MEM: ${MEM_USAGE}%)." >> "$LOG_FILE"
    fi
}
# 遍历监控所有进程
for process in "${PROCESSES[@]}"; do
    monitor_process "$process"
done

优势:

  • 配置灵活:通过修改PROCESSES数组即可增减监控进程,无需修改脚本逻辑。
  • 批量管理:适合中小型集群,统一管理多个关键服务。

监控脚本的优化与最佳实践

  1. 日志管理:使用logrotate工具轮转日志文件,避免单个日志文件过大。
  2. 告警集成:结合邮件(mail命令)、企业微信或钉钉机器人,实现实时告警通知。
  3. 性能优化:避免频繁调用ps命令,可结合/proc文件系统直接读取进程信息(如/proc/$PID/stat),减少资源消耗。
  4. 权限控制:脚本使用普通用户执行时,需确保对/var/log目录有写权限,或使用sudo提升权限。

Linux进程监控脚本是实现自动化运维的重要工具,从基础的存活检测到高级的资源分析与集群管理,可根据实际需求灵活扩展,通过合理设计脚本结构、优化性能和集成告警机制,管理员可以高效保障系统稳定运行,减少人工干预成本,无论是单机服务器还是小型集群,定制化的监控脚本都能成为提升运维效率的利器。

赞(0)
未经允许不得转载:好主机测评网 » Linux 进程监控脚本如何实现实时告警与日志记录?