载入天数...载入时分秒...

常用的shell

  • .java的启动
#!/usr/bin/env bash
# ============================================================
# Java Service Manager
# 作者:沐木
# 说明:通用内网 Java 部署脚本
# 支持自动检测 Java、自动识别 jar、首次部署兼容、本地执行 & systemd 安装
# ============================================================

set -euo pipefail

SERVICE_NAME="${SERVICE_NAME:-my-java-app}"
APP_DIR="${APP_DIR:-/opt/${SERVICE_NAME}/app}"
CONFIG_DIR="${CONFIG_DIR:-/opt/${SERVICE_NAME}/config}"
LOG_DIR="${LOG_DIR:-/opt/${SERVICE_NAME}/logs}"
PID_FILE="${PID_FILE:-${APP_DIR}/app.pid}"
JAVA_OPTS="${JAVA_OPTS:--Xms512m -Xmx1g}"
START_LOG="${START_LOG:-${LOG_DIR}/start.log}"
SYSTEMD_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
SCRIPT_PATH="$(readlink -f "$0")"

# -------------------- 自动检测 Java --------------------
detect_java() {
  if [[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]]; then
    echo "${JAVA_HOME}/bin/java"; return 0
  fi
  for j in /usr/bin/java /usr/local/java/bin/java /usr/java/latest/bin/java /opt/java/bin/java; do
    [[ -x "$j" ]] && { echo "$j"; return 0; }
  done
  command -v java >/dev/null 2>&1 && { command -v java; return 0; }
  echo ""
}
JAVA_BIN="${JAVA_BIN:-$(detect_java)}"
[[ -z "$JAVA_BIN" ]] && { echo "❌ 未检测到 Java,请设置 JAVA_HOME 或安装 JDK/JRE"; exit 1; }

# -------------------- 首次部署智能初始化 --------------------
init_paths() {
  if [[ ! -d "$APP_DIR" && -n "$(ls -1 ./*.jar 2>/dev/null | head -n1)" ]]; then
    echo "🧩 首次部署,使用当前目录作为 APP_DIR"
    APP_DIR="$(pwd)"
  fi
  if [[ ! -d "$CONFIG_DIR" ]]; then
    local has_conf
    has_conf=$(ls -1 ./application*.yml ./application*.yaml ./logback*.xml 2>/dev/null || true)
    if [[ -n "$has_conf" ]]; then
      echo "⚙️  检测到配置文件,创建 config 目录"
      mkdir -p "$CONFIG_DIR"
      for f in $has_conf; do mv -n "$f" "$CONFIG_DIR/" 2>/dev/null || true; done
    fi
  fi
  mkdir -p "$LOG_DIR"
}

# -------------------- 查找 jar 文件 --------------------
find_jar() {
  local jar=""
  jar=$(ls -t "$APP_DIR"/*.jar 2>/dev/null | head -n1 || true)
  [[ -z "$jar" ]] && jar=$(ls -t ./*.jar 2>/dev/null | head -n1 || true)
  echo "$jar"
}

is_running() {
  [[ -f "$PID_FILE" ]] && pid=$(cat "$PID_FILE" 2>/dev/null || true) && \
  kill -0 "$pid" 2>/dev/null && { echo "$pid"; return 0; }
  return 1
}

# -------------------- 基本控制 --------------------
start() {
  init_paths
  local jar=$(find_jar)
  [[ -z "$jar" ]] && { echo "❌ 未找到 jar 文件"; exit 1; }
  if pid=$(is_running); then echo "⚠️ 已运行 PID=$pid"; return 0; fi

  local logconf="${CONFIG_DIR}/logback-spring.xml"
  local springconf="--spring.config.location=${CONFIG_DIR}/"
  echo "🚀 启动 $jar"
  nohup "$JAVA_BIN" $JAVA_OPTS -Dlogging.config="$logconf" $springconf -jar "$jar" \
    >"$START_LOG" 2>&1 &
  echo $! >"$PID_FILE"
  echo "✅ 启动成功 PID=$(cat "$PID_FILE")"
}
stop() {
  if ! pid=$(is_running); then echo "❌ 未运行"; return; fi
  echo "🛑 停止 PID=$pid"
  kill "$pid" || true
  for i in {1..10}; do
    kill -0 "$pid" 2>/dev/null || { echo "✅ 已停止"; rm -f "$PID_FILE"; return; }
    sleep 1
  done
  echo "⚠️ 强制结束"; kill -9 "$pid" || true; rm -f "$PID_FILE"
}
status() { pid=$(is_running) && echo "✅ 运行中 PID=$pid" || echo "❌ 未运行"; }
tail_log() { tail -f "$START_LOG"; }

# -------------------- systemd 安装/卸载 --------------------
install_service() {
  init_paths
  [[ -f "$SYSTEMD_FILE" ]] || {
    echo "🧩 生成 systemd 配置"
    cat <<EOF | sudo tee "$SYSTEMD_FILE" >/dev/null
[Unit]
Description=Java Service: ${SERVICE_NAME}
After=network.target

[Service]
Type=simple
ExecStart=${SCRIPT_PATH} start
ExecStop=${SCRIPT_PATH} stop
ExecReload=${SCRIPT_PATH} restart
WorkingDirectory=${APP_DIR}
Restart=on-failure
LimitNOFILE=65535
User=$(whoami)
PrivateTmp=false
Environment="JAVA_HOME=${JAVA_HOME:-/usr}"
Environment="PATH=${JAVA_HOME:-/usr}/bin:/usr/local/bin:/usr/bin"

[Install]
WantedBy=multi-user.target
EOF
  }
  sudo systemctl daemon-reload
  sudo systemctl enable "$SERVICE_NAME"
  sudo systemctl start "$SERVICE_NAME"
  sudo systemctl status "$SERVICE_NAME" --no-pager
}
uninstall_service() {
  [[ -f "$SYSTEMD_FILE" ]] || { echo "❌ 未找到 systemd 文件"; return; }
  sudo systemctl stop "$SERVICE_NAME" || true
  sudo systemctl disable "$SERVICE_NAME" || true
  sudo rm -f "$SYSTEMD_FILE"
  sudo systemctl daemon-reload
  echo "🗑️ 已卸载 systemd 服务: $SERVICE_NAME"
}

# -------------------- 主命令入口 --------------------
case "${1:-}" in
  start) start ;;
  stop) stop ;;
  restart) stop; sleep 1; start ;;
  status) status ;;
  tail) tail_log ;;
  install) install_service ;;
  uninstall) uninstall_service ;;
  *) echo "用法: $0 {start|stop|restart|status|tail|install|uninstall}";;
esac
posted @ 2025-11-10 16:18  旧信  阅读(17)  评论(0)    收藏  举报