修复程序使用脚本启动后的控制台交互问题。

This commit is contained in:
2026-01-16 20:33:52 +08:00
parent bba05417d8
commit 6973ba3f46
4 changed files with 112 additions and 44 deletions

View File

@@ -1,12 +1,12 @@
#!/bin/bash
# Termux专属启动脚本 编译+启动 解决exit后卡空行/需手动^C/参数误判问题
# 优化:分离日志输出、保留终端交互、增强异常处理、适配新版参数解析
# 优化:移除命令行日志重定向完全依赖Java LogUtils输出日志、保留终端交互、增强异常处理
cd "$(dirname "${BASH_SOURCE[0]}")" || { echo "目录切换失败"; exit 1; }
BASE_DIR=$(cd .. && pwd)
LOG_DIR="$BASE_DIR/logs"
MAIN_LOG="$LOG_DIR/main.log"
# 1. 前置准备:创建日志目录
# 1. 前置准备:创建日志目录仅给Java LogUtils用脚本不再写日志
mkdir -p "$LOG_DIR" || { echo "日志目录创建失败"; exit 1; }
# 2. 编译校验
@@ -17,10 +17,9 @@ if [ ! -f "$BUILD_SH" ]; then
fi
bash "$BUILD_SH" || { echo "编译失败退出"; exit 1; }
# 3. 类路径配置(修复:指定完整包名主类)
# 3. 类路径配置(指定完整包名主类)
CLASSPATH="$BASE_DIR/runtime"
[ -d "$BASE_DIR/libs" ] && CLASSPATH="$CLASSPATH:$BASE_DIR/libs/*"
# 关键Main类带完整包名避免类找不到或参数解析异常
MAIN_CLASS="cc.winboll.Main"
# 4. JVM优化配置适配Termux低内存环境
@@ -39,24 +38,23 @@ on_exit() {
kill -9 $JAVA_PID 2>/dev/null
fi
stty sane
echo -e "✅ 服务已停止,日志文件:$MAIN_LOG"
echo -e "✅ 服务已停止,Java日志文件:$MAIN_LOG"
exit 1
}
# 捕获更多退出信号
trap 'on_exit' SIGINT SIGTERM SIGABRT SIGSEGV SIGILL
# 6. 启动服务(核心修改:分离日志保留终端stdin
# 6. 启动服务(核心修改:移除所有日志重定向stdout/stderr直接走终端
stty -echoctl # 屏蔽^C视觉印记
echo -e "🚀 服务启动中输入help查指令输入exit优雅停机"
echo -e "📝 日志输出路径:$MAIN_LOG\n"
echo -e "📝 Java日志输出路径:$MAIN_LOG\n"
# 关键:stdout/stderr 追加到日志但保留stdin给程序交互
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:ALL >> "$MAIN_LOG" 2>&1 &
# 关键:无任何重定向让Java的LogUtils负责写日志终端保留完整交互能力
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:ALL
JAVA_PID=$!
EXIT_CODE=$?
# 7. 等待Java进程结束解决卡空行问题
wait $JAVA_PID
EXIT_CODE=$?
# 8. 后置处理
stty sane
@@ -64,7 +62,8 @@ if [ $STOP_SIGNAL -eq 0 ]; then
if [ $EXIT_CODE -eq 0 ]; then
echo -e "\n✅ 服务优雅停机完成"
else
echo -e "\n❌ 服务异常退出,退出码:$EXIT_CODE,查看日志:$MAIN_LOG"
echo -e "\n❌ 服务异常退出,退出码:$EXIT_CODE,查看Java日志:$MAIN_LOG"
fi
fi
exit $EXIT_CODE

View File

@@ -1,40 +1,69 @@
#!/bin/bash
# Termux专属启动脚本 编译+启动 解决exit后卡空行/需手动^C问题
# 优化:增加JVM内存限制、进程异常捕获、日志输出
# Termux专属启动脚本 编译+启动 解决exit后卡空行/需手动^C/参数误判问题
# 优化:移除命令行日志重定向完全依赖Java LogUtils输出日志、保留终端交互、增强异常处理
cd "$(dirname "${BASH_SOURCE[0]}")" || { echo "目录切换失败"; exit 1; }
BASE_DIR=$(cd .. && pwd)
LOG_DIR="$BASE_DIR/logs"
MAIN_LOG="$LOG_DIR/main.log"
# 1. 编译校验
# 1. 前置准备创建日志目录仅给Java LogUtils用脚本不再写日志
mkdir -p "$LOG_DIR" || { echo "日志目录创建失败"; exit 1; }
# 2. 编译校验
BUILD_SH="$BASE_DIR/bash/build_class.sh"
if [ ! -f "$BUILD_SH" ]; then
echo "编译脚本不存在:$BUILD_SH"
exit 1
fi
bash "$BUILD_SH" || { echo "编译失败退出"; exit 1; }
# 2. 类路径配置
# 3. 类路径配置(指定完整包名主类)
CLASSPATH="$BASE_DIR/runtime"
[ -d "$BASE_DIR/libs" ] && CLASSPATH="$CLASSPATH:$BASE_DIR/libs/*"
MAIN_CLASS="Main"
MAIN_CLASS="cc.winboll.Main"
# 3. 关键优化JVM内存限制避免内存耗尽+ 异常日志输出
export _JAVA_OPTIONS="-Xmx128m -Xms64m" # 限制最大堆内存128M初始堆64M适配Termux
# 4. JVM优化配置适配Termux低内存环境
export _JAVA_OPTIONS="-Xmx128m -Xms64m -Dfile.encoding=UTF-8"
STOP_SIGNAL=0
JAVA_PID=0
# 捕获进程异常终止信号
# 5. 信号捕获:优雅停机+终端重置
on_exit() {
STOP_SIGNAL=1
echo -e "\n⚠ 服务异常终止,可查看日志排查问题"
echo -e "\n⚠ 收到停止信号,正在优雅停机..."
# 向Java进程发送中断信号
if [ $JAVA_PID -ne 0 ]; then
kill -INT $JAVA_PID 2>/dev/null
sleep 1
kill -9 $JAVA_PID 2>/dev/null
fi
stty sane
echo -e "✅ 服务已停止Java日志文件$MAIN_LOG"
exit 1
}
trap 'on_exit' SIGABRT SIGSEGV SIGILL SIGTERM
trap 'on_exit' SIGINT SIGTERM SIGABRT SIGSEGV SIGILL
# 4. 启动服务+日志输出
# 6. 启动服务核心修改移除所有日志重定向stdout/stderr直接走终端
stty -echoctl # 屏蔽^C视觉印记
echo -e "\n🚀 服务启动中输入help查指令输入exit优雅停机"
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:INFO &> "$BASE_DIR/logs/main.log"
echo -e "🚀 服务启动中输入help查指令输入exit优雅停机"
echo -e "📝 Java日志输出路径$MAIN_LOG\n"
# 5. Java退出后 强制重置终端+脚本退出,彻底无残留
if [ $STOP_SIGNAL -eq 0 ]; then
echo -e "\n✅ 服务优雅停机"
fi
# 关键无任何重定向让Java的LogUtils负责写日志终端保留完整交互能力
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:INFO
JAVA_PID=$!
EXIT_CODE=$?
# 7. 等待Java进程结束解决卡空行问题
wait $JAVA_PID
# 8. 后置处理
stty sane
exit $?
if [ $STOP_SIGNAL -eq 0 ]; then
if [ $EXIT_CODE -eq 0 ]; then
echo -e "\n✅ 服务优雅停机完成"
else
echo -e "\n❌ 服务异常退出,退出码:$EXIT_CODE查看Java日志$MAIN_LOG"
fi
fi
exit $EXIT_CODE