fix: bootstrap venv and clean legacy monitor process
This commit is contained in:
parent
53e0cf8a38
commit
0b6c228b54
@ -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():
|
||||
|
||||
@ -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():
|
||||
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user