• 首页
  • 邻居
  • 关于
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的学习笔记 Theme by OneBlog

    我的学习笔记博客

    搜索
    标签
    # 随笔 # Java # 教程 # openwrt # Mysql # SQL # 爬虫 # post # Js调优 # MAVEN
  • 首页>
  • 随笔>
  • 正文
  • linux 用脚本启动rocketmq控制台会被卡住

    2024年11月21日 2.1 k 阅读 1 评论 7751 字

    先给脚本设置权限
    chmod +x manage-services.sh

    #!/bin/bash
    
    # 基础配置
    SRC_DIR=/data/HH-Cloud  # 源码路径
    WORK_DIR=/data/jar      # 工作目录
    LOG_DIR=/data/scripts/logs      # 日志目录
    
    # 服务脚本列表
    SERVICE_SCRIPTS=(
        "xx-gateway"
    )
    
    # Nacos、RocketMQ 和 Seata 启动和停止脚本
    NACOS_START_CMD="bash /data/nacos/bin/startup.sh -m standalone"
    NACOS_STOP_CMD="bash /data/nacos/bin/shutdown.sh"
    ROCKETMQ_START_CMD="nohup sh /data/rocketmq-5.2.0/bin/mqnamesrv > /data/logs/rocketmq_namesrv.log 2>&1 &"
    ROCKETMQ_BROKER_CMD="nohup sh /data/rocketmq-5.2.0/bin/mqbroker -n 127.0.0.1:9876 > /data/logs/rocketmq_broker.log 2>&1 &"
    ROCKETMQ_STOP_CMD="sh /data/rocketmq-5.2.0/bin/mqshutdown namesrv && sh /data/rocketmq-5.2.0/bin/mqshutdown broker"
    SEATA_START_CMD="bash /data/seata-server-1.6.0/bin/seata-server.sh"
    SEATA_STOP_CMD="bash /data/seata-server-1.6.0/bin/seata-server.sh stop"
    
    OPTIONS="-Xms512m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
    
    # 确保目录存在
    mkdir -p $WORK_DIR
    mkdir -p $LOG_DIR
    
    # 启动单个服务
    start_service() {
        local SERVICE=$1
        local JAR_PATH=""
        local LOG_FILE=$LOG_DIR/$SERVICE.log
        local PID_FILE=/var/run/$SERVICE.pid
    
        echo "Starting $SERVICE..."
    
        # 查找 JAR 文件
        for DIR in "$SRC_DIR/hh-gateway/target" "$SRC_DIR/hh-modules/$SERVICE/target" "$SRC_DIR/hh-visual/$SERVICE/target" "$SRC_DIR/hh-auth/target"; do
            if [ -f "$DIR/$SERVICE.jar" ]; then
                JAR_PATH="$DIR/$SERVICE.jar"
                break
            fi
        done
    
        if [ -z "$JAR_PATH" ]; then
            echo "Error: JAR file for $SERVICE not found!"
            return
        fi
    
        # 检查是否已在运行
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if kill -0 $PID 2>/dev/null; then
                echo "$SERVICE is already running (PID: $PID)"
                return
            else
                echo "Stale PID file found for $SERVICE. Removing it."
                rm -f $PID_FILE
            fi
        fi
    
        # 停止旧进程(如果未正确停止)
        OLD_PID=$(ps -ef | grep "$SERVICE".jar | grep -v grep | awk '{print $2}')
        if [ -n "$OLD_PID" ]; then
            echo "Stopping old instance of $SERVICE (PID: $OLD_PID)..."
            kill -9 $OLD_PID
            echo "Old instance stopped."
        fi
    
        # 启动新服务
        nohup java $OPTIONS -jar $JAR_PATH --spring.profiles.active=stage > $LOG_FILE 2>&1 &
        NEW_PID=$!
        echo $NEW_PID > $PID_FILE
        echo "$SERVICE started (PID: $NEW_PID)"
    }
    
    # 停止单个服务
    stop_service() {
        local SERVICE=$1
        local PID_FILE=/var/run/$SERVICE.pid
    
        echo "Stopping $SERVICE..."
    
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if kill -0 $PID 2>/dev/null; then
                kill -9 $PID
                rm -f $PID_FILE
                echo "$SERVICE stopped."
            else
                echo "PID $PID not valid. Removing stale PID file."
                rm -f $PID_FILE
            fi
        else
            echo "$SERVICE is not running."
        fi
    }
    
    # 查询单个服务状态
    status_service() {
        local SERVICE=$1
        local PID_FILE=/var/run/$SERVICE.pid
    
        if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2>/dev/null; then
            echo "$SERVICE is running (PID: $(cat $PID_FILE))"
        else
            echo "$SERVICE is not running."
        fi
    }
    
    # 启动 Nacos、RocketMQ、Seata 服务
    start_nacos() {
        echo "Starting Nacos..."
        $NACOS_START_CMD &
        echo "Nacos started."
    }
    
    start_rocketmq() {
     echo "Starting RocketMQ..."
    
        # 启动 NameServer
        eval $ROCKETMQ_START_CMD
        sleep 2  # 稍等一下,确保 NameServer 启动
    
        # 启动 Broker
        eval $ROCKETMQ_BROKER_CMD
        sleep 2  # 稍等一下,确保 Broker 启动
    
        # 使用 disown 完全将进程与终端分离
        disown
    
        echo "RocketMQ started. Logs are available in /data/logs/rocketmq_namesrv.log and /data/logs/rocketmq_broker.log"
    }
    
    start_seata() {
        echo "Starting Seata..."
        $SEATA_START_CMD
        sleep 3  # 给 Seata 一些时间启动
        echo "Seata started."
    }
    
    # 停止 Nacos、RocketMQ、Seata 服务
    stop_nacos() {
        echo "Stopping Nacos..."
        $NACOS_STOP_CMD
        echo "Nacos stopped."
    }
    
    stop_rocketmq() {
        echo "Stopping RocketMQ..."
        $ROCKETMQ_STOP_CMD
        echo "RocketMQ stopped."
    }
    
    stop_seata() {
        echo "Stopping Seata..."
        $SEATA_STOP_CMD
        echo "Seata stopped."
    }
    
    # 检查 Nacos 服务状态
    status_nacos() {
        if pgrep -f "nacos-server.jar" > /dev/null; then
            echo "Nacos is running."
        else
            echo "Nacos is not running."
        fi
    }
    
    # 检查 RocketMQ 服务状态
    status_rocketmq() {
        if pgrep -f "mqnamesrv" > /dev/null && pgrep -f "mqbroker" > /dev/null; then
            echo "RocketMQ is running."
        else
            echo "RocketMQ is not running."
        fi
    }
    
    # 检查 Seata 服务状态
    status_seata() {
         if pgrep -f "seata-server" > /dev/null; then
            echo "Seata is running."
        else
            echo "Seata is not running."
        fi
    }
    
    # 检查参数
    if [ $# -lt 1 ]; then
        echo "Usage: $0 <start|stop|status> [service_name]"
        exit 1
    fi
    
    ACTION=$1
    SERVICE=$2
    
    # 根据参数执行操作
    case $ACTION in
        start)
            if [ -z "$SERVICE" ]; then
                # 启动所有服务
                start_nacos
                start_rocketmq
                start_seata
                for SERVICE in "${SERVICE_SCRIPTS[@]}"; do
                    start_service $SERVICE
                    sleep 2  # 确保每个服务有足够时间启动
                done
                echo "All services started."
            else
                # 启动指定服务
                if [[ "$SERVICE" == "nacos" ]]; then
                    start_nacos
                elif [[ "$SERVICE" == "rocketmq" ]]; then
                    start_rocketmq
                elif [[ "$SERVICE" == "seata" ]]; then
                    start_seata
                elif [[ " ${SERVICE_SCRIPTS[@]} " =~ " ${SERVICE} " ]]; then
                    start_service $SERVICE
                else
                    echo "Invalid service name: $SERVICE"
                    exit 1
                fi
            fi
            ;;
        stop)
            if [ -z "$SERVICE" ]; then
                # 停止所有服务
                stop_nacos
                stop_rocketmq
                stop_seata
                for SERVICE in "${SERVICE_SCRIPTS[@]}"; do
                    stop_service $SERVICE
                done
                echo "All services stopped."
            else
                # 停止指定服务
                if [[ "$SERVICE" == "nacos" ]]; then
                    stop_nacos
                elif [[ "$SERVICE" == "rocketmq" ]]; then
                    stop_rocketmq
                elif [[ "$SERVICE" == "seata" ]]; then
                    stop_seata
                elif [[ " ${SERVICE_SCRIPTS[@]} " =~ " ${SERVICE} " ]]; then
                    stop_service $SERVICE
                else
                    echo "Invalid service name: $SERVICE"
                    exit 1
                fi
            fi
            ;;
        status)
            if [ -z "$SERVICE" ]; then
                # 查询所有服务状态
                echo "Checking Nacos status..."
                status_nacos
                echo "Checking RocketMQ status..."
                status_rocketmq
                echo "Checking Seata status..."
                status_seata
                for SERVICE in "${SERVICE_SCRIPTS[@]}"; do
                    status_service $SERVICE
                done
            else
                # 查询指定服务状态
                if [[ "$SERVICE" == "nacos" ]]; then
                    status_nacos
                elif [[ "$SERVICE" == "rocketmq" ]]; then
                    status_rocketmq
                elif [[ "$SERVICE" == "seata" ]]; then
                    status_seata
                elif [[ " ${SERVICE_SCRIPTS[@]} " =~ " ${SERVICE} " ]]; then
                    status_service $SERVICE
                else
                    echo "Invalid service name: $SERVICE"
                    exit 1
                fi
            fi
            ;;
        *)
            echo "Invalid action: $ACTION. Use 'start', 'stop', or 'status'."
            exit 1
            ;;
    esac
    
    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    读者留言1

    1. 了凡四训 Lv.1
      2025-05-26 19:17 回复

      来大佬这里学习一下

    加载更多评论
    加载中...
    — 已加载全部评论 —
    首页邻居关于归档
    Copyright©2020-2026  All Rights Reserved.  Load:0.020 s
    京ICP备18019712号
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。