本文目录导读:

我来介绍几种使用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
使用建议
- 设置合适的检查间隔:根据服务器负载,设置5-15分钟的检查间隔
- 配置告警阈值:根据业务需求调整CPU、内存等阈值
- 保留监控日志:建议保留7-30天的监控记录
- 多重监控方式:结合进程检查、端口检查、状态页面检查
- 自动化恢复:设置自动重启机制,但要避免频繁重启
这些脚本可以根据您的具体需求进行调整和优化。