126 lines
4.0 KiB
Bash
Executable File
126 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# restart.sh — 重启指定服务
|
||
#
|
||
# 用法:
|
||
# ./restart.sh <service> # 重启后端服务(使用已有二进制)
|
||
# ./restart.sh <service> --build # 先重新编译再重启
|
||
# ./restart.sh <docker-service> # 重启 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 <service> [--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}"
|