191 lines
4.9 KiB
Bash
191 lines
4.9 KiB
Bash
#!/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 "安装完成!" |