#!/bin/bash # 核云IDC服务商VPS自动监测重启程序 - 安装脚本 # 该脚本会创建一个systemd服务,持续化运行当前目录下的python main.py命令 # 获取当前脚本所在目录的绝对路径 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" # 定义服务名称 SERVICE_NAME="idc-monitor" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" echo "正在安装 ${SERVICE_NAME} 服务..." # 检查是否以root权限运行 if [ "$EUID" -ne 0 ]; then echo "错误: 请以root权限运行此脚本 (sudo ./install.sh)" exit 1 fi # 检查Python是否已安装 if ! command -v python3 &> /dev/null; then if command -v python &> /dev/null; then PYTHON_CMD="python" else echo "错误: 未找到Python,请先安装Python" exit 1 fi else PYTHON_CMD="python3" fi echo "检测到Python: ${PYTHON_CMD}" # 检查并安装pip install_pip() { echo "正在安装pip..." # 尝试使用系统包管理器安装pip if command -v apt-get &> /dev/null; then apt-get update && apt-get install -y python3-pip PIP_CMD="pip3" elif command -v yum &> /dev/null; then yum install -y python3-pip PIP_CMD="pip3" elif command -v dnf &> /dev/null; then dnf install -y python3-pip PIP_CMD="pip3" else # 如果包管理器不可用,使用get-pip.py echo "未检测到常用包管理器,尝试使用get-pip.py安装..." curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py ${PYTHON_CMD} get-pip.py rm -f get-pip.py PIP_CMD="pip" fi # 验证pip安装 if command -v pip3 &> /dev/null; then PIP_CMD="pip3" elif command -v pip &> /dev/null; then PIP_CMD="pip" else echo "错误: pip安装失败" return 1 fi echo "✅ pip安装成功: ${PIP_CMD}" return 0 } # 检查pip是否存在 if command -v pip3 &> /dev/null; then PIP_CMD="pip3" echo "检测到pip: ${PIP_CMD}" elif command -v pip &> /dev/null; then PIP_CMD="pip" echo "检测到pip: ${PIP_CMD}" else echo "警告: 未检测到pip" read -p "是否现在安装pip?(Y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Nn]$ ]]; then echo "跳过pip安装" PIP_CMD="" else if ! install_pip; then echo "错误: pip安装失败,无法继续" exit 1 fi fi fi # 安装Python依赖 if [ -f "${PROJECT_DIR}/requirements.txt" ]; then if [ -n "${PIP_CMD}" ]; then echo "正在安装Python依赖包..." cd ${PROJECT_DIR} if ${PIP_CMD} install -r requirements.txt; then echo "✅ Python依赖包安装成功" else echo "❌ Python依赖包安装失败" read -p "是否继续安装服务?(y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "安装已取消" exit 1 fi fi else echo "警告: 跳过依赖包安装(pip不可用)" fi else echo "警告: ${PROJECT_DIR}/requirements.txt 文件不存在,跳过依赖安装" fi # 检查main.py是否存在 if [ ! -f "${PROJECT_DIR}/main.py" ]; then echo "警告: ${PROJECT_DIR}/main.py 文件不存在" echo "请确保main.py文件位于项目根目录下" read -p "是否继续安装?(y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "安装已取消" exit 1 fi fi # ... existing code ... # 创建systemd服务文件 cat > ${SERVICE_FILE} << EOF [Unit] Description=Heyun IDC Monitor Service After=network.target Wants=network-online.target [Service] Type=simple User=root WorkingDirectory=${PROJECT_DIR} ExecStart=${PYTHON_CMD} ${PROJECT_DIR}/main.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=${SERVICE_NAME} # 资源限制 LimitNOFILE=65536 # 安全设置 NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=${PROJECT_DIR} [Install] WantedBy=multi-user.target EOF # ... existing code ... # 重新加载systemd配置 systemctl daemon-reload # 启用服务(开机自启) systemctl enable ${SERVICE_NAME} # 启动服务 systemctl start ${SERVICE_NAME} # 检查服务状态 if systemctl is-active --quiet ${SERVICE_NAME}; then echo "✅ ${SERVICE_NAME} 服务已成功安装并启动" echo "服务状态: 运行中" else echo "❌ ${SERVICE_NAME} 服务启动失败" echo "请检查日志: journalctl -u ${SERVICE_NAME} -f" exit 1 fi echo "" echo "常用命令:" echo " 查看服务状态: systemctl status ${SERVICE_NAME}" echo " 查看实时日志: journalctl -u ${SERVICE_NAME} -f" echo " 停止服务: systemctl stop ${SERVICE_NAME}" echo " 重启服务: systemctl restart ${SERVICE_NAME}" echo " 卸载服务: ./uninstall.sh" echo "" echo "安装完成!"