| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/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
|