Shell脚本如何监控PHP-FPM进程

wen 实用脚本 1

本文目录导读:

Shell脚本如何监控PHP-FPM进程

  1. 基础进程监控脚本
  2. 全面的健康检查脚本
  3. 使用Swoole状态检查(如果已安装)
  4. Crontab配置示例
  5. 高级监控脚本(带性能分析)
  6. 使用建议

我来介绍几种使用Shell脚本监控PHP-FPM进程的方法:

基础进程监控脚本

#!/bin/bash
# PHP-FPM进程监控脚本
PHP_FPM_NAME="php-fpm"
LOG_FILE="/var/log/php-fpm-monitor.log"
# 检查PHP-FPM进程是否运行
check_php_fpm_process() {
    local process_count=$(ps aux | grep -v grep | grep "${PHP_FPM_NAME}" | wc -l)
    if [ "$process_count" -eq 0 ]; then
        echo "$(date): PHP-FPM进程未运行" >> $LOG_FILE
        return 1
    else
        echo "$(date): PHP-FPM运行正常,进程数: $process_count" >> $LOG_FILE
        return 0
    fi
}
# 自动重启PHP-FPM
restart_php_fpm() {
    echo "$(date): 尝试重启PHP-FPM..." >> $LOG_FILE
    # 尝试多种方式重启
    if command -v systemctl &> /dev/null; then
        systemctl restart php*-fpm* 2>/dev/null
    elif [ -f /etc/init.d/php*-fpm* ]; then
        /etc/init.d/php*-fpm* restart 2>/dev/null
    elif command -v service &> /dev/null; then
        service php*-fpm* restart 2>/dev/null
    fi
    # 检查重启结果
    if [ $? -eq 0 ]; then
        echo "$(date): PHP-FPM重启成功" >> $LOG_FILE
    else
        echo "$(date): PHP-FPM重启失败" >> $LOG_FILE
    fi
}
# 执行监控
check_php_fpm_process
if [ $? -ne 0 ]; then
    restart_php_fpm
fi

全面的健康检查脚本

#!/bin/bash
# PHP-FPM健康检查脚本
PHP_STATUS_URL="http://127.0.0.1:9000/status"
PHP_FPM_POOL="/etc/php-fpm.d/www.conf"
LOG_FILE="/var/log/php-fpm-health-check.log"
ALERT_EMAIL="admin@example.com"
# 检查PHP-FPM状态页面
check_status_page() {
    if curl -s -o /dev/null -w "%{http_code}" $PHP_STATUS_URL | grep -q 200; then
        return 0
    else
        return 1
    fi
}
# 获取PHP-FPM进程统计
get_process_stats() {
    local stats=$(ps aux | grep "php-fpm: pool" | wc -l)
    local idle=$(ps aux | grep "php-fpm: pool" | grep -i idle | wc -l)
    local busy=$(ps aux | grep "php-fpm: pool" | grep -i "process" | wc -l)
    echo "总进程数: $stats"
    echo "空闲进程: $idle"
    echo "忙碌进程: $busy"
}
# 检查CPU和内存使用
check_resource_usage() {
    local cpu_usage=$(ps aux | grep php-fpm | grep -v grep | awk '{sum+=$3} END {print sum}')
    local mem_usage=$(ps aux | grep php-fpm | grep -v grep | awk '{sum+=$4} END {print sum}')
    echo "CPU使用率: $cpu_usage%"
    echo "内存使用率: $mem_usage%"
    # 检查是否超过阈值
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        echo "警告: CPU使用率过高"
        return 1
    fi
    if (( $(echo "$mem_usage > 80" | bc -l) )); then
        echo "警告: 内存使用率过高"
        return 1
    fi
    return 0
}
# 发送告警通知
send_alert() {
    local message=$1
    if [ -n "$ALERT_EMAIL" ]; then
        echo "$message" | mail -s "PHP-FPM告警通知" $ALERT_EMAIL
    fi
    # 也可以发送到Telegram或其他通知服务
    # curl -s -X POST "https://api.telegram.org/botTOKEN/sendMessage" -d "chat_id=CHAT_ID&text=$message"
}
# 主监控函数
monitor_php_fpm() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "=== PHP-FPM监控报告 ===" > $LOG_FILE
    echo "时间: $timestamp" >> $LOG_FILE
    echo "-------------------" >> $LOG_FILE
    # 检查进程状态
    if ! check_status_page; then
        echo "状态: 异常" >> $LOG_FILE
        send_alert "PHP-FPM状态页面无法访问"
        restart_php_fpm
    else
        echo "状态: 正常" >> $LOG_FILE
    fi
    # 获取进程统计
    get_process_stats >> $LOG_FILE
    # 检查资源使用
    check_resource_usage >> $LOG_FILE
}
monitor_php_fpm

使用Swoole状态检查(如果已安装)

#!/bin/bash
# 使用Swoole查看PHP-FPM状态
check_swoole_status() {
    if command -v php &> /dev/null; then
        php -r "
            \$status = json_decode(file_get_contents('http://127.0.0.1:9000/status?json'), true);
            if (\$status) {
                foreach (\$status as \$key => \$value) {
                    echo \"\$key: \$value\n\";
                }
            } else {
                echo '无法获取状态信息\n';
            }
        "
    fi
}
# 生成JSON格式的监控报告
generate_json_report() {
    local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    local process_count=$(ps aux | grep "php-fpm: pool" | wc -l)
    local cpu_usage=$(ps aux | grep php-fpm | grep -v grep | awk '{sum+=$3} END {print sum}')
    local mem_usage=$(ps aux | grep php-fpm | grep -v grep | awk '{sum+=$4} END {print sum}')
    echo "{
        \"timestamp\": \"$timestamp\",
        \"process_count\": $process_count,
        \"cpu_usage\": $cpu_usage,
        \"memory_usage\": $mem_usage,
        \"status\": \"active\"
    }"
}

Crontab配置示例

# 每5分钟检查一次
*/5 * * * * /usr/local/bin/php-fpm-monitor.sh
# 每小时生成一次详细报告
0 * * * * /usr/local/bin/php-fpm-health-check.sh
# 每天凌晨重启一次
0 3 * * * systemctl restart php-fpm

高级监控脚本(带性能分析)

#!/bin/bash
# PHP-FPM性能监控脚本
MONITOR_DIR="/var/log/php-fpm-monitor"
PID_FILE="/var/run/php-fpm/php-fpm.pid"
# 创建监控目录
mkdir -p $MONITOR_DIR
# 分析PHP-FPM日志
analyze_php_fpm_logs() {
    local log_file="/var/log/php-fpm.log"
    local error_count=$(grep -c "ERROR\|WARNING" $log_file 2>/dev/null)
    if [ $error_count -gt 0 ]; then
        echo "$(date): 检测到 $error_count 个错误/警告" >> $MONITOR_DIR/error.log
        # 获取最近10条错误信息
        grep "ERROR\|WARNING" $log_file | tail -10 >> $MONITOR_DIR/recent_errors.log
    fi
}
# 检查慢请求
check_slow_requests() {
    local slow_log="/var/log/php-fpm-slow.log"
    if [ -f "$slow_log" ]; then
        local slow_count=$(wc -l < $slow_log)
        if [ $slow_count -gt 0 ]; then
            echo "$(date): 检测到 $slow_count 个慢请求" >> $MONITOR_DIR/slow_requests.log
        fi
    fi
}
# 生成性能报告
generate_performance_report() {
    local report_file="$MONITOR_DIR/performance_$(date +%Y%m%d).log"
    echo "=== PHP-FPM性能报告 ===" > $report_file
    echo "报告时间: $(date)" >> $report_file
    echo "-----------------------------------" >> $report_file
    # 获取进程详细信息
    ps aux | grep php-fpm | grep -v grep | \
        awk '{printf "PID: %s, CPU: %s%%, MEM: %s%%, RSS: %sMB\n", $2, $3, $4, $6/1024}' >> $report_file
    echo "-----------------------------------" >> $report_file
    analyze_php_fpm_logs
    check_slow_requests
}
# 主函数
main() {
    echo "$(date): 开始PHP-FPM监控" >> $MONITOR_DIR/monitor.log
    # 检查进程是否存在
    if [ -f "$PID_FILE" ] && kill -0 $(cat $PID_FILE) 2>/dev/null; then
        echo "PHP-FPM进程正常" >> $MONITOR_DIR/monitor.log
        generate_performance_report
    else
        echo "PHP-FPM进程异常" >> $MONITOR_DIR/monitor.log
        restart_php_fpm
    fi
}
main

使用建议

  1. 设置合适的检查间隔:根据服务器负载,设置5-15分钟的检查间隔
  2. 配置告警阈值:根据业务需求调整CPU、内存等阈值
  3. 保留监控日志:建议保留7-30天的监控记录
  4. 多重监控方式:结合进程检查、端口检查、状态页面检查
  5. 自动化恢复:设置自动重启机制,但要避免频繁重启

这些脚本可以根据您的具体需求进行调整和优化。

抱歉,评论功能暂时关闭!