#!/bin/bash # 停止Docker服务监控脚本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 停止监控进程 stop_monitoring() { log_info "停止监控进程..." local monitor_pid_file="./storage/logs/monitor.pid" local stopped=false # 通过PID文件停止 if [ -f "$monitor_pid_file" ]; then local monitor_pid=$(cat "$monitor_pid_file") if kill -0 $monitor_pid 2>/dev/null; then log_info "通过PID文件停止监控进程 (PID: $monitor_pid)" kill $monitor_pid sleep 2 # 确认进程已停止 if ! kill -0 $monitor_pid 2>/dev/null; then log_success "监控进程已停止" stopped=true else log_warning "监控进程未响应TERM信号,尝试强制停止..." kill -9 $monitor_pid 2>/dev/null || true sleep 1 if ! kill -0 $monitor_pid 2>/dev/null; then log_success "监控进程已强制停止" stopped=true fi fi else log_warning "PID文件中的进程不存在" fi rm -f "$monitor_pid_file" fi # 通过进程名停止(备用方法) if [ "$stopped" = false ]; then log_info "通过进程名查找并停止监控进程..." local pids=$(pgrep -f "monitor-services.sh" || true) if [ -n "$pids" ]; then for pid in $pids; do log_info "停止监控进程 (PID: $pid)" kill $pid 2>/dev/null || true done sleep 2 # 检查是否还有进程运行 local remaining_pids=$(pgrep -f "monitor-services.sh" || true) if [ -n "$remaining_pids" ]; then log_warning "强制停止剩余的监控进程..." for pid in $remaining_pids; do kill -9 $pid 2>/dev/null || true done fi log_success "所有监控进程已停止" stopped=true else log_info "未找到运行中的监控进程" stopped=true fi fi return 0 } # 停止Docker服务 stop_services() { log_info "停止Docker服务..." if docker-compose ps -q | grep -q .; then docker-compose down log_success "Docker服务已停止" else log_info "没有运行中的Docker服务" fi } # 清理日志文件 cleanup_logs() { local cleanup_logs=$1 if [ "$cleanup_logs" = true ]; then log_info "清理监控日志文件..." local log_files=( "./storage/logs/monitor.log" "./storage/logs/monitor-output.log" "./storage/logs/restart_counters" ) for item in "${log_files[@]}"; do if [ -f "$item" ]; then rm -f "$item" log_info "删除文件: $item" elif [ -d "$item" ]; then rm -rf "$item" log_info "删除目录: $item" fi done log_success "日志文件清理完成" fi } # 显示使用帮助 show_help() { echo "停止Docker服务监控脚本" echo "" echo "用法: $0 [选项]" echo "" echo "选项:" echo " --stop-services 同时停止Docker服务" echo " --cleanup-logs 清理监控日志文件" echo " --all 停止监控、服务并清理日志" echo " -h, --help 显示此帮助信息" echo "" echo "默认情况下,此脚本只停止监控进程,不影响Docker服务。" } # 主函数 main() { local stop_services_flag=false local cleanup_logs_flag=false # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in --stop-services) stop_services_flag=true shift ;; --cleanup-logs) cleanup_logs_flag=true shift ;; --all) stop_services_flag=true cleanup_logs_flag=true shift ;; -h|--help) show_help exit 0 ;; *) echo "未知选项: $1" show_help exit 1 ;; esac done echo "========================================" echo "停止Docker服务监控" echo "时间: $(date)" echo "========================================" # 执行停止操作 stop_monitoring if [ "$stop_services_flag" = true ]; then stop_services fi cleanup_logs "$cleanup_logs_flag" echo "" log_success "操作完成" if [ "$stop_services_flag" = false ]; then log_info "Docker服务仍在运行,使用 'docker-compose down' 停止服务" fi } # 如果脚本被直接执行 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi