linux 用脚本启动rocketmq控制台会被卡住

先给脚本设置权限
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

0

版权声明 ▶ 本网站名称:我的学习笔记
▶ 本文链接:https://ooolo.net/article/574.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!!

none
最后修改于:2024年11月22日 14:31

添加新评论

icon_mrgreen.pngicon_neutral.pngicon_twisted.pngicon_arrow.pngicon_eek.pngicon_smile.pngicon_confused.pngicon_cool.pngicon_evil.pngicon_biggrin.pngicon_idea.pngicon_redface.pngicon_razz.pngicon_rolleyes.pngicon_wink.pngicon_cry.pngicon_surprised.pngicon_lol.pngicon_mad.pngicon_sad.pngicon_exclaim.pngicon_question.png