#!/bin/bash # LJWX 系统监控脚本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 获取 Docker Compose 命令 get_compose_cmd() { if docker compose version &> /dev/null; then echo "docker compose" else echo "docker-compose" fi } # 检查服务状态 check_service_status() { local compose_cmd compose_cmd=$(get_compose_cmd) echo -e "${BLUE}🔍 检查服务状态...${NC}" echo "" # 获取所有服务状态 local services=("ljwx-mysql" "ljwx-redis" "ljwx-boot" "ljwx-bigscreen" "ljwx-admin") local all_healthy=true for service in "${services[@]}"; do local status status=$(docker inspect --format='{{.State.Status}}' "$service" 2>/dev/null || echo "not found") local health health=$(docker inspect --format='{{if .State.Health}}{{.State.Health.Status}}{{else}}no healthcheck{{end}}' "$service" 2>/dev/null || echo "not found") printf "%-15s " "$service:" case $status in "running") if [ "$health" = "healthy" ] || [ "$health" = "no healthcheck" ]; then echo -e "${GREEN}✅ 运行正常${NC}" else echo -e "${YELLOW}⚠️ 运行中 (健康检查: $health)${NC}" all_healthy=false fi ;; "exited") echo -e "${RED}❌ 已停止${NC}" all_healthy=false ;; "not found") echo -e "${RED}❌ 容器不存在${NC}" all_healthy=false ;; *) echo -e "${YELLOW}⚠️ 状态异常: $status${NC}" all_healthy=false ;; esac done echo "" if [ "$all_healthy" = true ]; then echo -e "${GREEN}🎉 所有服务运行正常${NC}" else echo -e "${YELLOW}⚠️ 部分服务存在问题${NC}" fi } # 检查端口连通性 check_ports() { echo "" echo -e "${BLUE}🌐 检查端口连通性...${NC}" echo "" # 从 .env 文件读取端口配置 if [ -f .env ]; then source .env else echo -e "${YELLOW}⚠️ 未找到 .env 文件,使用默认端口${NC}" LJWX_ADMIN_PORT=80 LJWX_BIGSCREEN_PORT=5000 LJWX_BOOT_PORT=9998 fi local ports=( "管理后台:${LJWX_ADMIN_PORT}" "大屏系统:${LJWX_BIGSCREEN_PORT}" "后端API:${LJWX_BOOT_PORT}" ) for port_info in "${ports[@]}"; do local name="${port_info%:*}" local port="${port_info#*:}" printf "%-10s " "${name}:" if curl -f -s --max-time 5 "http://localhost:${port}" > /dev/null 2>&1; then echo -e "${GREEN}✅ 端口 ${port} 可访问${NC}" else echo -e "${RED}❌ 端口 ${port} 不可访问${NC}" fi done } # 检查资源使用情况 check_resources() { echo "" echo -e "${BLUE}📊 检查资源使用情况...${NC}" echo "" # 内存使用 local mem_info mem_info=$(free -h | grep Mem:) local mem_used mem_used=$(echo "$mem_info" | awk '{print $3}') local mem_total mem_total=$(echo "$mem_info" | awk '{print $2}') echo -e "内存使用: ${GREEN}${mem_used}${NC} / ${mem_total}" # 磁盘使用 local disk_info disk_info=$(df -h . | tail -1) local disk_used disk_used=$(echo "$disk_info" | awk '{print $3}') local disk_total disk_total=$(echo "$disk_info" | awk '{print $2}') local disk_percent disk_percent=$(echo "$disk_info" | awk '{print $5}') echo -e "磁盘使用: ${GREEN}${disk_used}${NC} / ${disk_total} (${disk_percent})" # Docker 容器资源使用 echo "" echo -e "${BLUE}🐳 容器资源使用:${NC}" docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" | grep ljwx || echo "未找到运行的容器" } # 检查日志错误 check_logs() { echo "" echo -e "${BLUE}📝 检查最近的错误日志...${NC}" echo "" local compose_cmd compose_cmd=$(get_compose_cmd) local services=("ljwx-boot" "ljwx-bigscreen" "ljwx-mysql" "ljwx-redis" "ljwx-admin") local found_errors=false for service in "${services[@]}"; do local errors errors=$($compose_cmd logs --tail=50 "$service" 2>/dev/null | grep -i "error\|exception\|failed" | tail -3 || true) if [ -n "$errors" ]; then echo -e "${YELLOW}⚠️ ${service} 最近错误:${NC}" echo "$errors" | sed 's/^/ /' echo "" found_errors=true fi done if [ "$found_errors" = false ]; then echo -e "${GREEN}✅ 未发现明显错误${NC}" fi } # 生成健康报告 generate_report() { local timestamp timestamp=$(date '+%Y-%m-%d %H:%M:%S') local report_file="health_report_$(date '+%Y%m%d_%H%M%S').txt" echo "LJWX 系统健康报告" > "$report_file" echo "生成时间: $timestamp" >> "$report_file" echo "=============================" >> "$report_file" echo "" >> "$report_file" # 服务状态 echo "服务状态:" >> "$report_file" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep ljwx >> "$report_file" || echo "无运行的服务" >> "$report_file" echo "" >> "$report_file" # 资源使用 echo "资源使用:" >> "$report_file" free -h >> "$report_file" echo "" >> "$report_file" df -h . >> "$report_file" echo "" >> "$report_file" # 容器资源 echo "容器资源:" >> "$report_file" docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" | grep ljwx >> "$report_file" || echo "无运行的容器" >> "$report_file" echo -e "${GREEN}✅ 健康报告已生成: ${report_file}${NC}" } # 自动修复常见问题 auto_fix() { echo "" echo -e "${YELLOW}🔧 尝试自动修复常见问题...${NC}" local compose_cmd compose_cmd=$(get_compose_cmd) # 重启异常的容器 local services=("ljwx-mysql" "ljwx-redis" "ljwx-boot" "ljwx-bigscreen" "ljwx-admin") for service in "${services[@]}"; do local status status=$(docker inspect --format='{{.State.Status}}' "$service" 2>/dev/null || echo "not found") if [ "$status" = "exited" ] || [ "$status" = "dead" ]; then echo -e "${BLUE}重启服务: ${service}${NC}" $compose_cmd restart "$service" fi done # 清理临时文件和缓存 echo -e "${BLUE}清理Docker缓存...${NC}" docker system prune -f > /dev/null 2>&1 || true echo -e "${GREEN}✅ 自动修复完成${NC}" } # 显示实时监控 real_time_monitor() { echo -e "${BLUE}🔄 实时监控模式 (按 Ctrl+C 退出)${NC}" echo "" while true; do clear echo -e "${BLUE}LJWX 系统实时监控 - $(date '+%Y-%m-%d %H:%M:%S')${NC}" echo "======================================================" check_service_status check_ports echo "" echo -e "${BLUE}📊 容器状态:${NC}" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.CPUPerc}}\t{{.MemUsage}}" | grep -E "ljwx|NAMES" || echo "无运行的容器" echo "" echo -e "${YELLOW}等待30秒... (按 Ctrl+C 退出)${NC}" sleep 30 done } # 主程序 main() { case "${1:-status}" in "status"|"check") check_service_status check_ports ;; "resources"|"res") check_resources ;; "logs") check_logs ;; "report") check_service_status check_ports check_resources check_logs generate_report ;; "fix") auto_fix ;; "monitor"|"watch") real_time_monitor ;; "help"|"-h"|"--help") echo "LJWX 系统监控脚本" echo "" echo "使用方法:" echo " ./monitor.sh [command]" echo "" echo "命令:" echo " status 检查服务状态 (默认)" echo " resources 检查资源使用" echo " logs 检查错误日志" echo " report 生成健康报告" echo " fix 自动修复问题" echo " monitor 实时监控" echo " help 显示帮助" ;; *) echo -e "${RED}❌ 未知命令: $1${NC}" echo -e "${YELLOW}使用 './monitor.sh help' 查看帮助${NC}" exit 1 ;; esac } # 执行主程序 main "$@"