diff --git a/ops/deploy_via_tat.py b/ops/deploy_via_tat.py index 9aaef55..c91f039 100755 --- a/ops/deploy_via_tat.py +++ b/ops/deploy_via_tat.py @@ -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(): diff --git a/ops/open_port_via_tat.py b/ops/open_port_via_tat.py index bc1143a..c3ab81a 100755 --- a/ops/open_port_via_tat.py +++ b/ops/open_port_via_tat.py @@ -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(): diff --git a/scripts/common.sh b/scripts/common.sh index ece8862..04078bf 100755 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -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" +} diff --git a/scripts/install_systemd.sh b/scripts/install_systemd.sh index fab6b54..2bdfbad 100755 --- a/scripts/install_systemd.sh +++ b/scripts/install_systemd.sh @@ -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" diff --git a/scripts/stop.sh b/scripts/stop.sh index cfa8061..bdd2406 100755 --- a/scripts/stop.sh +++ b/scripts/stop.sh @@ -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