#!/usr/bin/env bash # 须用 bash 执行;若误用 sh/dash 会自动改用 bash 再跑一遍 [ -n "${BASH_VERSION:-}" ] || exec /usr/bin/env bash "$0" ${1+"$@"} # 重启 Java 后端 chat_web_yj.jar(与 start_all.sh 一致) # 日志:gangyan/logs/backend.log # 勿在此加 -Dspring.datasource*:与 application-local.yml 打架易连错库。 # 若 jar 未重打、内嵌 yml 仍是远程库,必须依赖 backend/application-local.yml(含完整 spring 数据源)。 set -u source "$(cd "$(dirname "$0")" && pwd)/common-restart.sh" # 默认 backend.log;若曾被 root 创建导致当前用户不可写,则改用同目录 backend-<用户>.log(仍在 gangyan/logs 下) LOG_FILE="$LOG_DIR/backend.log" if ! ( umask 022; : >>"$LOG_FILE" ) 2>/dev/null; then ALT="$LOG_DIR/backend-$(id -un).log" if ( umask 022; : >>"$ALT" ) 2>/dev/null; then LOG_FILE="$ALT" log_tee "注意: $LOG_DIR/backend.log 不可写(多为 root 遗留),已改用 $LOG_FILE" log_tee "修复后可统一回 backend.log: sudo chown $(id -un):$(id -gn) \"$LOG_DIR/backend.log\" 或 sudo rm -f \"$LOG_DIR/backend.log\"" else mkdir -p "${HOME}/.gangyan/logs" LOG_FILE="${HOME}/.gangyan/logs/backend-restart.log" log_tee "注意: gangyan/logs 不可写,Java 日志暂存: $LOG_FILE" fi fi export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH="$JAVA_HOME/bin:$PATH" log_tee "======== 停止 chat_web_yj.jar ========" pkill -f "chat_web_yj.jar" 2>/dev/null && log_tee "已发送停止信号" || log_tee "未找到运行中的进程" sleep 2 log_tee "======== 启动 chat_web_yj.jar ========" cd "$GANGYAN_ROOT/backend" LOCAL_CFG="$GANGYAN_ROOT/backend/application-local.yml" EXTRA_JAVA_ARGS=() if [ -f "$LOCAL_CFG" ]; then log_tee "加载本地配置: $LOCAL_CFG" EXTRA_JAVA_ARGS=(-Dspring.config.additional-location="file:${LOCAL_CFG}") fi nohup java -jar \ -Xms512m -Xmx2048m \ "${EXTRA_JAVA_ARGS[@]}" \ -Dspring.profiles.active=yj \ chat_web_yj.jar >> "$LOG_FILE" 2>&1 & STARTED_PID=$! log_tee "已后台启动,PID=$STARTED_PID" log_tee "Java 标准输出/错误写入: $LOG_FILE" sleep 3 if kill -0 "$STARTED_PID" 2>/dev/null; then if command -v ss >/dev/null 2>&1 && ss -tln 2>/dev/null | grep -q ':8099'; then log_tee "自检: 进程存活且 8099 已监听(后端已就绪或即将就绪)" else log_tee "自检: 进程存活,但 8099 尚未监听(可能仍在启动;若 10 秒后仍无,请 tail 上面日志路径)" fi else log_tee "自检失败: 进程已退出。请查看日志末尾:" tail -n 40 "$LOG_FILE" 2>/dev/null | while IFS= read -r line || [ -n "$line" ]; do log_line "$line"; done fi