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。
愿你走出半生,归来仍是少年!
浙公网安备 33010602011771号