fix: bootstrap venv and clean legacy monitor process

This commit is contained in:
ZuoZuo 2026-04-22 01:05:36 +08:00
parent 53e0cf8a38
commit 0b6c228b54
5 changed files with 82 additions and 24 deletions

View File

@ -8,6 +8,10 @@ import base64
import json
# 读取本地 .env 和运行环境变量。
import os
# site 用来把项目 .venv 的依赖注入当前解释器。
import site
# sys 只用来判断当前解释器前缀。
import sys
# TAT 轮询需要 sleep 和超时控制。
import time
# Path 用于稳定定位项目根目录。
@ -15,17 +19,6 @@ from pathlib import Path
# 类型提示只用于提高可读性。
from typing import Callable, TypeVar
# 腾讯云凭据对象。
from tencentcloud.common import credential
# 腾讯云 SDK 统一异常类型。
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 客户端公共配置。
from tencentcloud.common.profile.client_profile import ClientProfile
# HTTP endpoint 配置。
from tencentcloud.common.profile.http_profile import HttpProfile
# TAT 客户端和模型。
from tencentcloud.tat.v20201028 import models as tat_models, tat_client
# 项目根目录,后面要从这里读取 .env。
ROOT = Path(__file__).resolve().parents[1]
@ -47,6 +40,32 @@ DEFAULT_APP_PORT = os.environ.get("APP_PORT", "2026")
T = TypeVar("T")
def load_project_venv() -> None:
# 如果当前本来就在项目虚拟环境里运行,就不需要重复处理。
if str(ROOT / ".venv") in sys.prefix:
return
# 遍历项目 .venv 下可能存在的 site-packages 目录。
for candidate in (ROOT / ".venv" / "lib").glob("python*/site-packages"):
# 把依赖目录加入解释器搜索路径。
site.addsitedir(str(candidate))
# 先注入项目虚拟环境,再导入腾讯云 SDK。
load_project_venv()
# 腾讯云凭据对象。
from tencentcloud.common import credential
# 腾讯云 SDK 统一异常类型。
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 客户端公共配置。
from tencentcloud.common.profile.client_profile import ClientProfile
# HTTP endpoint 配置。
from tencentcloud.common.profile.http_profile import HttpProfile
# TAT 客户端和模型。
from tencentcloud.tat.v20201028 import models as tat_models, tat_client
def load_env_file(path: Path) -> None:
# .env 不存在时允许继续使用外部环境变量。
if not path.exists():

View File

@ -8,6 +8,10 @@ import base64
import json
# 环境变量读取来自项目根目录的 .env。
import os
# site 用来把项目 .venv 的依赖注入当前解释器。
import site
# sys 只用来判断当前解释器前缀。
import sys
# 轮询 TAT 执行结果时需要 sleep 和超时控制。
import time
# Path 用于稳定定位项目根目录和 .env 文件。
@ -15,19 +19,6 @@ from pathlib import Path
# 类型提示只用于提升可读性。
from typing import Callable, TypeVar
# 腾讯云凭据对象。
from tencentcloud.common import credential
# 腾讯云 SDK 统一异常类型。
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 客户端公共配置。
from tencentcloud.common.profile.client_profile import ClientProfile
# HTTP endpoint 配置。
from tencentcloud.common.profile.http_profile import HttpProfile
# CVM 用来查实例绑定的安全组。
from tencentcloud.cvm.v20170312 import cvm_client, models as cvm_models
# TAT 用来远程执行放行脚本。
from tencentcloud.tat.v20201028 import models as tat_models, tat_client
# 项目根目录,后面要从这里读 .env。
ROOT = Path(__file__).resolve().parents[1]
@ -45,6 +36,34 @@ DEFAULT_CIDR = os.environ.get("OPEN_CIDR", "0.0.0.0/0")
T = TypeVar("T")
def load_project_venv() -> None:
# 如果当前本来就在项目虚拟环境里运行,就不需要重复处理。
if str(ROOT / ".venv") in sys.prefix:
return
# 遍历项目 .venv 下可能存在的 site-packages 目录。
for candidate in (ROOT / ".venv" / "lib").glob("python*/site-packages"):
# 把依赖目录加入解释器搜索路径。
site.addsitedir(str(candidate))
# 先注入项目虚拟环境,再导入腾讯云 SDK。
load_project_venv()
# 腾讯云凭据对象。
from tencentcloud.common import credential
# 腾讯云 SDK 统一异常类型。
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 客户端公共配置。
from tencentcloud.common.profile.client_profile import ClientProfile
# HTTP endpoint 配置。
from tencentcloud.common.profile.http_profile import HttpProfile
# CVM 用来查实例绑定的安全组。
from tencentcloud.cvm.v20170312 import cvm_client, models as cvm_models
# TAT 用来远程执行放行脚本。
from tencentcloud.tat.v20201028 import models as tat_models, tat_client
def load_env_file(path: Path) -> None:
# .env 不存在时允许继续使用外部环境变量。
if not path.exists():

View File

@ -50,3 +50,21 @@ has_systemd_unit() {
fi
systemctl cat "$SYSTEMD_SERVICE_NAME" >/dev/null 2>&1
}
stop_legacy_process() {
local pid
pid="$(read_pid || true)"
if [ -n "${pid:-}" ] && kill -0 "$pid" >/dev/null 2>&1; then
kill "$pid" >/dev/null 2>&1 || true
for _ in $(seq 1 10); do
if ! kill -0 "$pid" >/dev/null 2>&1; then
break
fi
sleep 1
done
kill -9 "$pid" >/dev/null 2>&1 || true
fi
rm -f "$PID_FILE"
}

View File

@ -20,6 +20,7 @@ fi
install -m 0644 "$UNIT_SRC" "$UNIT_DST"
chmod +x "$ROOT_DIR"/scripts/*.sh
stop_legacy_process
systemctl daemon-reload
systemctl enable "$SYSTEMD_SERVICE_NAME"
systemctl restart "$SYSTEMD_SERVICE_NAME"

View File

@ -7,6 +7,7 @@ source "$SCRIPT_DIR/common.sh"
if has_systemd_unit; then
systemctl stop "$SYSTEMD_SERVICE_NAME"
stop_legacy_process
echo "hy-app-monitor stopped"
exit 0
fi