开发工具

如何监控 httpd 的进程数,根据监控情况做相应处理?

以下是一个用于监控Apache HTTPD(httpd)进程数的Shell脚本,可根据进程数阈值触发报警、服务重启或资源清理操作,并提供详细注释和扩展建议:

脚本功能

1、实时监控httpd进程总数
2、支持自定义进程数阈值(警告/严重)
3、触发动作:发送警报、重启服务、清理旧进程
4、自动记录监控日志

脚本代码

#!/bin/bash
# HTTPD进程监控脚本

# 配置参数
PROCESS_NAME="httpd"        # 监控的进程名(根据实际调整)
WARNING_THRESHOLD=150       # 警告阈值(进程数)
CRITICAL_THRESHOLD=200      # 严重阈值(进程数)
MAX_LOG_LINES=1000          # 日志文件最大保留行数
LOG_FILE="/var/log/httpd_monitor.log"  # 日志路径
ALERT_EMAIL="admin@example.com"        # 告警通知邮箱

# 获取当前进程数
get_process_count() {
    pgrep -c "$PROCESS_NAME"  # 准确统计进程数(避免grep自身干扰)
}

# 日志管理(防止日志过大)
manage_log() {
    if [ -f "$LOG_FILE" ]; then
        log_lines=$(wc -l < "$LOG_FILE")
        if [ "$log_lines" -gt "$MAX_LOG_LINES" ]; then
            tail -n 500 "$LOG_FILE" > "${LOG_FILE}.tmp"
            mv "${LOG_FILE}.tmp" "$LOG_FILE"
        fi
    fi
}

# 日志记录函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 触发警告动作
trigger_warning() {
    local count=$1
    log "警告: HTTPD进程数过高 (当前: $count)"
    echo "HTTPD进程数警告: $count" | mail -s "HTTPD进程警报" "$ALERT_EMAIL"
}

# 触发严重状态动作
trigger_critical() {
    local count=$1
    log "严重: HTTPD进程数严重超标 (当前: $count),尝试重启服务"
    
    # 1. 尝试正常重启
    systemctl restart httpd || service httpd restart
    
    # 2. 检查重启是否成功
    sleep 5
    if ! pgrep "$PROCESS_NAME" >/dev/null; then
        log "错误: HTTPD重启失败,尝试强制清理"
        pkill -9 "$PROCESS_NAME"
        systemctl start httpd
    fi
    
    # 3. 发送二次通知
    echo "HTTPD已强制重启" | mail -s "HTTPD紧急处理" "$ALERT_EMAIL"
}

# 主监控逻辑
monitor() {
    manage_log
    current_count=$(get_process_count)
    
    if [ "$current_count" -ge "$CRITICAL_THRESHOLD" ]; then
        trigger_critical "$current_count"
    elif [ "$current_count" -ge "$WARNING_THRESHOLD" ]; then
        trigger_warning "$current_count"
    else
        log "正常: HTTPD进程数正常 (当前: $current_count)"
    fi
}

# 执行监控
monitor


部署与使用

1. 配置参数

根据实际环境修改 PROCESS_NAME(如使用 apache2 需改为对应进程名)

调整阈值 WARNING_THRESHOLDCRITICAL_THRESHOLD


2. 设置定时任务

# 每5分钟监控一次(通过crontab -e添加)
*/5 * * * * /root/httpd_monitor.sh


3. 手动测试

# 模拟进程数超限(测试警告)
sudo bash -c "for i in {1..200}; do touch /tmp/httpd_test_$i; done"

# 查看日志
tail -f /var/log/httpd_monitor.log



扩展功能

1. 自动分析高进程数原因

# 在trigger_warning中添加以下代码
log "附加诊断:"
ps aux | grep "$PROCESS_NAME" >> "$LOG_FILE"
netstat -tnlp | grep ":80 " >> "$LOG_FILE"
top -bn1 -p $(pgrep -d ',' "$PROCESS_NAME") >> "$LOG_FILE"


2. 限制HTTPD最大进程数

# 自动调整Apache配置(需根据实际配置路径修改)
adjust_config() {
    local max_clients=$((CRITICAL_THRESHOLD - 20))
    sed -i "s/MaxRequestWorkers.*/MaxRequestWorkers $max_clients/" /etc/httpd/conf/httpd.conf
    systemctl reload httpd
}


3. 集成监控平台

发送告警至Prometheus或Zabbix:

# 上报指标(示例)
curl -X POST -d "httpd_process_count=$current_count" http://monitor.example.com/api/metrics



注意事项

1、权限要求

脚本需以root权限运行(因涉及服务重启)

配置sudo免密(若使用非root用户):

# 在/etc/sudoers中添加
your_user ALL=(ALL) NOPASSWD: /bin/systemctl restart httpd, /bin/killall httpd


2、进程名匹配

使用 pgrep -c 替代 ps | grep -v grep | wc -l 更准确


3、服务兼容性

适配不同系统服务管理命令(如CentOS用 systemctl,Ubuntu用 service)


4、资源占用

高频监控(如每秒一次)需优化日志和命令效率


通过此脚本,您可以有效监控Apache HTTPD的进程状态,及时应对资源过载问题,保障服务稳定性。建议结合服务器性能指标(如CPU/内存)综合分析,以更精准地设定阈值。