From f0369c62461df348fe1ce3357230d6b15249ab9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=99=93=E4=B8=9C?= <763795151@qq.com> Date: Wed, 6 Aug 2025 20:21:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96linux=E5=90=AF=E5=81=9C?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/shutdown.sh | 64 ++++++++++++++++++++++++++++++++++++++++++------- bin/start.sh | 52 ++++++++++++++++++++++++++++++---------- 2 files changed, 95 insertions(+), 21 deletions(-) diff --git a/bin/shutdown.sh b/bin/shutdown.sh index f0f09ce..0e9c524 100644 --- a/bin/shutdown.sh +++ b/bin/shutdown.sh @@ -1,13 +1,61 @@ #!/bin/bash -PREFIX='./' -CMD=$0 -if [[ $CMD == $PREFIX* ]]; then - CMD=${CMD:2} +# 获取脚本真实路径(兼容Linux和macOS) +if [ -L "$0" ]; then + # 处理符号链接 + if command -v greadlink >/dev/null 2>&1; then + SCRIPT_PATH=$(greadlink -f "$0") + elif command -v readlink >/dev/null 2>&1; then + SCRIPT_PATH=$(readlink -f "$0") + else + # 使用perl作为备选 + SCRIPT_PATH=$(perl -e 'use Cwd "abs_path"; print abs_path(shift)' "$0" 2>/dev/null) + fi +else + SCRIPT_PATH="$0" fi -SCRIPT_DIR=$(dirname "`pwd`/$CMD") -PROJECT_DIR=`dirname "$SCRIPT_DIR"` + +# 最终回退方案 +if [ -z "$SCRIPT_PATH" ] || [ ! -f "$SCRIPT_PATH" ]; then + SCRIPT_PATH="$0" +fi + +# 计算项目根目录 +SCRIPT_DIR=$(dirname "$SCRIPT_PATH") +PROJECT_DIR=$(cd "$SCRIPT_DIR" && cd .. && pwd 2>/dev/null) + +# 验证项目目录是否存在 +if [ ! -d "$PROJECT_DIR" ]; then + echo "ERROR: Failed to determine project directory!" >&2 + exit 1 +fi + # 不要修改进程标记,作为进程属性关闭使用 PROCESS_FLAG="kafka-console-ui-process-flag:${PROJECT_DIR}" -pkill -f $PROCESS_FLAG -echo 'Stop Kafka-console-ui!' \ No newline at end of file + +# 停止前检查进程是否存在 +if pgrep -f "$PROCESS_FLAG" >/dev/null; then + # 先尝试正常停止 + pkill -f "$PROCESS_FLAG" + + # 等待进程退出 + TIMEOUT=10 + while [ $TIMEOUT -gt 0 ]; do + if ! pgrep -f "$PROCESS_FLAG" >/dev/null; then + break + fi + sleep 1 + TIMEOUT=$((TIMEOUT - 1)) + done + + # 检查是否仍有进程存在 + if pgrep -f "$PROCESS_FLAG" >/dev/null; then + # 强制终止 + pkill -9 -f "$PROCESS_FLAG" + echo "Stop Kafka-console-ui! (force killed)" + else + echo "Stop Kafka-console-ui! (gracefully stopped)" + fi +else + echo "Kafka-console-ui is not running." +fi \ No newline at end of file diff --git a/bin/start.sh b/bin/start.sh index de89872..716d250 100644 --- a/bin/start.sh +++ b/bin/start.sh @@ -1,29 +1,55 @@ #!/bin/bash -# 设置jvm堆大小及栈大小,栈大小最少设置为256K,不要小于这个值,比如设置为128,太小了 +# 设置jvm堆大小及栈大小 JAVA_MEM_OPTS="-Xmx512m -Xms512m -Xmn256m -Xss256k" -PREFIX='./' -CMD=$0 -if [[ $CMD == $PREFIX* ]]; then - CMD=${CMD:2} +# 获取脚本真实路径(兼容Linux和macOS) +if [ -L "$0" ]; then + # 处理符号链接 + if command -v greadlink >/dev/null 2>&1; then + # macOS使用greadlink(需brew install coreutils) + SCRIPT_PATH=$(greadlink -f "$0") + else + # Linux使用readlink + SCRIPT_PATH=$(readlink -f "$0") + fi +else + SCRIPT_PATH="$0" fi -SCRIPT_DIR=$(dirname "`pwd`/$CMD") -PROJECT_DIR=`dirname "$SCRIPT_DIR"` + +# 如果上述方法失败(如macOS无greadlink),使用替代方案 +if [ -z "$SCRIPT_PATH" ] || [ ! -f "$SCRIPT_PATH" ]; then + # 使用perl跨平台解决方案 + SCRIPT_PATH=$(perl -e 'use Cwd "abs_path"; print abs_path(shift)' "$0" 2>/dev/null) +fi + +# 最终回退方案 +if [ -z "$SCRIPT_PATH" ] || [ ! -f "$SCRIPT_PATH" ]; then + SCRIPT_PATH="$0" +fi + +# 计算项目根目录 +SCRIPT_DIR=$(dirname "$SCRIPT_PATH") +PROJECT_DIR=$(cd "$SCRIPT_DIR" && cd .. && pwd) CONF_FILE="$PROJECT_DIR/config/application.yml" TARGET="$PROJECT_DIR/lib/kafka-console-ui.jar" -#设置h2文件根目录 -DATA_DIR=$PROJECT_DIR +# 设置h2文件根目录 +DATA_DIR="$PROJECT_DIR" -# 日志目录,默认为当前工程目录下 # 这个是错误输出,如果启动命令有误,输出到这个文件,应用日志不会输出到error.out,应用日志输出到上面的kafka-console-ui.log中 ERROR_OUT="$PROJECT_DIR/error.out" -# 不要修改进程标记,作为进程属性关闭使用,如果要修改,请把shutdown.sh里的该属性的值保持一致 +# 日志目录 +LOG_HOME="$PROJECT_DIR" PROCESS_FLAG="kafka-console-ui-process-flag:${PROJECT_DIR}" JAVA_OPTS="$JAVA_OPTS $JAVA_MEM_OPTS -Dfile.encoding=utf-8" -nohup java -jar $JAVA_OPTS $TARGET --spring.config.location="$CONF_FILE" --logging.home="$PROJECT_DIR" --data.dir=$DATA_DIR $PROCESS_FLAG 1>/dev/null 2>$ERROR_OUT & +# 启动应用 +nohup java -jar $JAVA_OPTS "$TARGET" \ + --spring.config.location="$CONF_FILE" \ + --logging.home="$LOG_HOME" \ + --data.dir="$DATA_DIR" \ + "$PROCESS_FLAG" >/dev/null 2>"$ERROR_OUT" & -echo "Kafka-console-ui Started!" \ No newline at end of file +echo "Kafka-console-ui Started! PID: $!" \ No newline at end of file