#!/usr/bin/env bash # ============================================================================= # restart.sh — 重启指定服务 # # 用法: # ./restart.sh # 重启后端服务(使用已有二进制) # ./restart.sh --build # 先重新编译再重启 # ./restart.sh # 重启 Docker 容器(redis/kafka/etcd) # # 示例: # ./restart.sh chat-api # ./restart.sh chat-api --build # ./restart.sh redis # ============================================================================= set -euo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" load_env init_script_log # ← 脚本执行日志 SVC="${1:-}" OPT="${2:-}" [[ -z "$SVC" ]] && { error "用法: $0 [--build]"; exit 1; } # ── 服务配置(与 05-start.sh 保持一致)─────────────────────────────────────── declare -A svc_workdir=( [openim-server]="$ROOT_DIR/open-im-server" [chat-rpc]="$ROOT_DIR/chat" [admin-rpc]="$ROOT_DIR/chat" [chat-api]="$ROOT_DIR/chat" [admin-api]="$ROOT_DIR/chat" [meetingmsg]="$ROOT_DIR/meetingmsg" [livecloud]="$ROOT_DIR/livecloud" [livestream]="$ROOT_DIR/livestream" ) declare -A svc_args=( [openim-server]="-c $ROOT_DIR/open-im-server/config" [chat-rpc]="-c $ROOT_DIR/chat/config" [admin-rpc]="-c $ROOT_DIR/chat/config" [chat-api]="-c $ROOT_DIR/chat/config" [admin-api]="-c $ROOT_DIR/chat/config" [meetingmsg]="" [livecloud]="" [livestream]="" ) declare -A svc_src_dir=( [openim-server]="open-im-server" [chat-rpc]="chat" [admin-rpc]="chat" [chat-api]="chat" [admin-api]="chat" [meetingmsg]="meetingmsg" [livecloud]="livecloud" [livestream]="livestream" ) declare -A svc_src_pkg=( [openim-server]="./cmd/main.go" [chat-rpc]="./cmd/rpc/chat-rpc/" [admin-rpc]="./cmd/rpc/admin-rpc/" [chat-api]="./cmd/api/chat-api/" [admin-api]="./cmd/api/admin-api/" [meetingmsg]="." [livecloud]="." [livestream]="." ) # ── Docker 容器重启 ─────────────────────────────────────────────────────────── _restart_docker() { local label="$1" cname="$2" require_docker_running if docker ps -a --format '{{.Names}}' | grep -q "^${cname}$"; then info "重启容器 $cname ..." docker restart "$cname" > /dev/null sleep 2 if docker ps --format '{{.Names}}' | grep -q "^${cname}$"; then success "$label 容器已重启 (container=$cname)" else error "$label 重启失败" fi else warn "容器 $cname 不存在,请先执行 03-start-infra.sh" fi } # ── 处理 Docker 容器 ────────────────────────────────────────────────────────── case "$SVC" in redis) _restart_docker "Redis" "dev-redis"; exit 0 ;; kafka) _restart_docker "Kafka" "dev-kafka"; exit 0 ;; etcd) _restart_docker "Etcd" "dev-etcd"; exit 0 ;; esac # ── 处理后端服务 ────────────────────────────────────────────────────────────── if [[ -z "${svc_workdir[$SVC]:-}" ]]; then error "未知服务: $SVC" echo "后端服务: ${!svc_workdir[*]}" echo "Docker: redis, kafka, etcd" exit 1 fi step "重启服务: $SVC" # 是否先重新编译 if [[ "$OPT" == "--build" ]]; then info "重新编译 $SVC ..." dir="$ROOT_DIR/${svc_src_dir[$SVC]}" pkg="${svc_src_pkg[$SVC]}" (cd "$dir" && go build -o "$BUILD_DIR/$SVC" "$pkg") && \ success "编译完成" || { error "编译失败"; exit 1; } fi # 停止旧进程 stop_svc "$SVC" sleep 1 # 启动新进程 start_svc "$SVC" \ "$BUILD_DIR/$SVC" \ "${svc_args[$SVC]}" \ "${svc_workdir[$SVC]}" echo "" echo -e "查看日志: ${CYAN}./deploy-test/logs.sh $SVC${NC}"