#!/bin/bash # IoT Platform 服务器初始化脚本 # 在 online180 上执行,创建规范目录结构并迁移现有服务到 systemd set -e APP_NAME="iot-platform" INSTALL_DIR="/opt/${APP_NAME}" BACKUP_DIR="${INSTALL_DIR}/backup" LOG_DIR="${INSTALL_DIR}/logs" CONFIG_DIR="${INSTALL_DIR}/config" BIN_DIR="${INSTALL_DIR}/bin" OLD_JAR="/home/${APP_NAME}.jar" OLD_LOG_DIR="/home/logs" echo "========================================" echo "IoT Platform 服务器初始化" echo "========================================" # 1. 创建目录结构 echo "[1/7] 创建目录结构..." mkdir -p "${INSTALL_DIR}" "${BACKUP_DIR}" "${LOG_DIR}" "${CONFIG_DIR}" "${BIN_DIR}" # 2. 迁移 JAR 文件 echo "[2/7] 迁移 JAR 文件..." if [ -f "${OLD_JAR}" ]; then cp -a "${OLD_JAR}" "${INSTALL_DIR}/${APP_NAME}.jar" echo " 已复制: ${OLD_JAR} -> ${INSTALL_DIR}/${APP_NAME}.jar" else echo " 警告: 未找到旧 JAR 文件 ${OLD_JAR}" fi # 3. 迁移日志 echo "[3/7] 迁移日志..." if [ -d "${OLD_LOG_DIR}" ]; then # 复制已有日志 cp -a "${OLD_LOG_DIR}"/* "${LOG_DIR}/" 2>/dev/null || true echo " 已复制日志到 ${LOG_DIR}" # 可选:备份旧日志目录,创建软链接 mv "${OLD_LOG_DIR}" "${OLD_LOG_DIR}.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null || true ln -s "${LOG_DIR}" "${OLD_LOG_DIR}" 2>/dev/null || true echo " 旧日志目录已备份并创建软链接" else echo " 旧日志目录不存在,跳过迁移" fi # 4. 设置权限 echo "[4/7] 设置权限..." chmod 755 "${INSTALL_DIR}" "${BACKUP_DIR}" "${LOG_DIR}" "${CONFIG_DIR}" "${BIN_DIR}" # 5. 安装 .env 文件(如果当前目录有) echo "[5/7] 安装环境变量文件..." if [ -f "/tmp/iot-platform.env" ]; then cp "/tmp/iot-platform.env" "${INSTALL_DIR}/.env" chmod 600 "${INSTALL_DIR}/.env" echo " 已安装 .env" else echo " 警告: 未找到 /tmp/iot-platform.env,请手动创建 ${INSTALL_DIR}/.env" fi # 6. 安装 systemd 服务 echo "[6/7] 安装 systemd 服务..." if [ -f "/tmp/iot-platform.service" ]; then cp "/tmp/iot-platform.service" /etc/systemd/system/iot-platform.service chmod 644 /etc/systemd/system/iot-platform.service systemctl daemon-reload systemctl enable iot-platform echo " systemd 服务已安装并启用" else echo " 错误: 未找到 /tmp/iot-platform.service" exit 1 fi # 7. 平滑切换:停止旧进程,启动 systemd echo "[7/7] 平滑切换到 systemd..." OLD_PID=$(ps -ef | grep java | grep "${APP_NAME}.jar" | grep -v grep | grep -v systemd | awk '{print $2}' | head -1) if [ -n "${OLD_PID}" ]; then echo " 发现旧进程 PID=${OLD_PID}, 发送 SIGTERM..." kill -TERM "${OLD_PID}" 2>/dev/null || true # 等待最多 30 秒 for i in $(seq 1 30); do if ! kill -0 "${OLD_PID}" 2>/dev/null; then echo " 旧进程已停止" break fi sleep 1 done # 强制结束 if kill -0 "${OLD_PID}" 2>/dev/null; then echo " 旧进程未响应,发送 SIGKILL..." kill -KILL "${OLD_PID}" 2>/dev/null || true fi else echo " 未发现旧进程" fi echo "" echo "启动 systemd 服务..." systemctl start iot-platform sleep 3 # 检查服务状态 if systemctl is-active --quiet iot-platform; then echo "" echo "========================================" echo "初始化成功!" echo "========================================" echo "服务状态:" systemctl status iot-platform --no-pager echo "" echo "目录结构:" ls -la "${INSTALL_DIR}" echo "" echo "常用命令:" echo " systemctl status iot-platform # 查看状态" echo " journalctl -u iot-platform -f # 实时日志" echo " systemctl stop iot-platform # 停止服务" echo " systemctl restart iot-platform # 重启服务" else echo "" echo "========================================" echo "警告: 服务启动可能失败,请检查日志" echo "========================================" journalctl -u iot-platform --no-pager -n 50 exit 1 fi