Sentinel系列---【linux离线安装sentinel】

1.github下载sentinel-dashboard.jar包

地址:https://github.com/alibaba/Sentinel/releases

2.run.sh启动脚本

#!/bin/bash

#===============================================================================================
#   通用 Java 应用启动/停止脚本
#
#   作者: hjw
#   日期: 2023-10-27
#   描述: 用于在 Linux系统上管理单个 JAR 应用程序。
#
#   功能:
#   - 自动发现同目录下的 *.jar 文件
#   - 支持 start, stop, status, restart 命令
#   - 支持通过 --port=xxxx 参数指定端口
#   - 在同级目录生成 pid 文件和 log 文件
#   - 为 start/stop/restart 提供真实的进度条反馈
#
#   使用方法:
#   1. 将此脚本与您的 .jar 文件放在同一个目录下
#   2. 赋予执行权限: chmod +x run.sh
#   3. 启动: ./run.sh start
#   4. 启动并指定端口: ./run.sh start --port=8888
#   5. 停止: ./run.sh stop
#   6. 查看状态: ./run.sh status
#   7. 重启: ./run.sh restart
#===============================================================================================

# --- 可配置区域 ---

# JVM 参数 (可根据需要修改)
JAVA_OPTS="-Xms512m -Xmx1024m -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard"

# 默认端口 (如果启动时不指定)
DEFAULT_PORT=8080

# 启动/停止超时时间 (秒)
START_TIMEOUT=60
STOP_TIMEOUT=30

# --- 内部变量定义 (通常无需修改) ---

# 颜色定义
C_RESET='\033[0m'
C_RED='\033[0;31m'
C_GREEN='\033[0;32m'
C_YELLOW='\033[0;33m'

# 自动查找JAR文件
JAR_FILE=$(find . -maxdepth 1 -name "*.jar" | head -n 1)

# 如果找不到JAR文件,则退出
if [ -z "$JAR_FILE" ]; then
    echo -e "${C_RED}错误: 在当前目录下未找到任何 .jar 文件。${C_RESET}"
    exit 1
fi

# 从JAR文件名派生应用名、PID文件名和日志文件名
APP_NAME=$(basename "$JAR_FILE" .jar)
PID_FILE="${APP_NAME}.pid"
LOG_FILE="${APP_NAME}.log"

# 解析命令行参数以获取端口
PORT=$DEFAULT_PORT
for arg in "$@"; do
    if [[ $arg == --port=* ]]; then
        PORT="${arg#*=}"
    fi
done

# --- 辅助函数 ---

# 带有颜色的输出函数
function echo_color() {
    local color=$1
    shift
    echo -e "${color}$*${C_RESET}"
}

# 获取并验证PID
function get_pid() {
    if [ -f "$PID_FILE" ]; then
        local pid=$(cat "$PID_FILE")
        if ps -p "$pid" > /dev/null 2>&1; then
            echo "$pid"
        else
            # 进程不存在,但PID文件存在,清理无效的PID文件
            rm -f "$PID_FILE"
            echo ""
        fi
    else
        echo ""
    fi
}

# 进度条函数
# 参数1: 当前进度值
# 参数2: 总进度值
# 参数3: 进度条说明文字
function progress_bar() {
    local current=$1
    local total=$2
    local text=$3
    local percent=$((current * 100 / total))
    local filled_len=$((percent / 2))
    local empty_len=$((50 - filled_len))

    # 构建进度条字符串
    local filled_bar=$(printf "%${filled_len}s" | tr ' ' '#')
    local empty_bar=$(printf "%${empty_len}s" | tr ' ' '-')

    # 使用 \r 回到行首刷新,实现动态效果
    printf "\r${C_YELLOW}%s${C_RESET}: [${C_GREEN}%s%s${C_RESET}] %d%%" "$text" "$filled_bar" "$empty_bar" "$percent"

    # 如果进度完成,换行
    if [ "$current" -eq "$total" ]; then
        echo
    fi
}

# --- 核心功能函数 ---

function do_start() {
    local pid=$(get_pid)
    if [ -n "$pid" ]; then
        echo_color "$C_YELLOW" "应用 ${APP_NAME} 已经在运行,PID: $pid"
        exit 0
    fi

    echo_color "$C_GREEN" "正在启动 ${APP_NAME},端口: ${PORT}..."
    
    # 使用 nohup 在后台运行,并将日志输出到文件
    nohup java ${JAVA_OPTS} -Dserver.port=${PORT} -jar "${JAR_FILE}" > "${LOG_FILE}" 2>&1 &
    
    # 获取新进程的PID并写入PID文件
    local new_pid=$!
    echo "$new_pid" > "$PID_FILE"
    
    # 启动进度条 (通过检查端口是否被监听)
    echo "等待应用启动..."
    for i in $(seq 1 $START_TIMEOUT); do
        # 使用lsof检查端口,比netstat更可靠
        if lsof -i :${PORT} > /dev/null 2>&1; then
            progress_bar $START_TIMEOUT $START_TIMEOUT "启动完成"
            echo_color "$C_GREEN" "${APP_NAME} 启动成功! PID: $new_pid, 日志文件: ${LOG_FILE}"
            return 0
        fi
        progress_bar $i $START_TIMEOUT "启动中"
        sleep 1
    done

    # 超时处理
    progress_bar $START_TIMEOUT $START_TIMEOUT "启动超时"
    echo_color "$C_RED" "启动失败: ${START_TIMEOUT}秒内应用未在端口 ${PORT} 上启动。"
    echo_color "$C_YELLOW" "请检查日志文件: ${LOG_FILE}"
    # 清理失败的进程和PID文件
    kill -9 "$new_pid" > /dev/null 2>&1
    rm -f "$PID_FILE"
    exit 1
}

function do_stop() {
    local pid=$(get_pid)
    if [ -z "$pid" ]; then
        echo_color "$C_YELLOW" "应用 ${APP_NAME} 未在运行。"
        exit 0
    fi

    echo_color "$C_GREEN" "正在停止 ${APP_NAME} (PID: $pid)..."
    
    # 发送优雅的终止信号 (SIGTERM)
    kill -15 "$pid"
    
    # 停止进度条 (通过检查PID是否存在)
    for i in $(seq 1 $STOP_TIMEOUT); do
        if ! ps -p "$pid" > /dev/null 2>&1; then
            progress_bar $STOP_TIMEOUT $STOP_TIMEOUT "停止完成"
            rm -f "$PID_FILE"
            echo_color "$C_GREEN" "${APP_NAME} 已成功停止。"
            return 0
        fi
        progress_bar $i $STOP_TIMEOUT "停止中"
        sleep 1
    done

    # 超时处理,强制杀死
    progress_bar $STOP_TIMEOUT $STOP_TIMEOUT "停止超时"
    echo_color "$C_RED" "优雅停止超时,将强制杀死进程 (kill -9)..."
    kill -9 "$pid"
    rm -f "$PID_FILE"
    echo_color "$C_GREEN" "${APP_NAME} 已被强制停止。"
    exit 1
}

function do_status() {
    local pid=$(get_pid)
    if [ -n "$pid" ]; then
        # 尝试获取应用正在监听的端口
        local listening_port=$(lsof -i -P -n | grep LISTEN | grep "$pid" | awk '{print $9}' | cut -d: -f2 | head -n 1)
        if [ -z "$listening_port" ]; then
            listening_port="未知"
        fi
        echo_color "$C_GREEN" "▶ ${APP_NAME} 正在运行"
        echo "  - PID: $pid"
        echo "  - 监听端口: $listening_port"
        echo "  - 日志文件: ${LOG_FILE}"
    else
        echo_color "$C_RED" "■ ${APP_NAME} 未在运行"
    fi
}

function do_restart() {
    echo_color "$C_GREEN" "正在重启 ${APP_NAME}..."
    do_stop
    # 在重启前稍作等待,确保端口等资源已释放
    echo "等待2秒..."
    sleep 2
    do_start
}

# --- 主逻辑 ---

# 检查lsof命令是否存在
if ! command -v lsof &> /dev/null; then
    echo_color "$C_RED" "错误: 'lsof' 命令未找到。请先安装它 (yum install -y lsof)。"
    exit 1
fi

case "$1" in
    start)
        do_start "$@"
        ;;
    stop)
        do_stop
        ;;
    status)
        do_status
        ;;
    restart)
        do_restart "$@"
        ;;
    *)
        echo "用法: $0 {start|stop|status|restart} [--port=xxxx]"
        echo "  start     启动应用 (可附加 --port=xxxx 指定端口)"
        echo "  stop      停止应用"
        echo "  status    查看应用运行状态"
        echo "  restart   重启应用 (可附加 --port=xxxx 指定端口)"
        exit 1
        ;;
esac

exit 0

3.启动

sh run.sh start

4.验证

启动后可以通过IP:8080访问控制台,控制台账号密码默认都是sentinel。

posted on 2025-08-11 00:31  少年攻城狮  阅读(25)  评论(0)    收藏  举报

导航