feat: add migrations, test scripts, and utility tools
- Add database migrations (006-028) for face recognition, identity, file_uuid - Add test scripts for ASR, face, search, processing - Add portal frontend (Tauri) - Add config, benchmark, and monitoring utilities - Add model checkpoints and pretrained model references
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""
|
||||
改进的关机测试脚本
|
||||
测试进程检测和停止逻辑
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import subprocess
|
||||
import psutil
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
def find_processes(keywords):
|
||||
"""查找包含关键字的进程"""
|
||||
processes = []
|
||||
for proc in psutil.process_iter(["pid", "name", "cmdline"]):
|
||||
try:
|
||||
cmdline = " ".join(proc.info["cmdline"]) if proc.info["cmdline"] else ""
|
||||
name = proc.info["name"] or ""
|
||||
|
||||
for keyword in keywords:
|
||||
if keyword in cmdline or keyword in name:
|
||||
processes.append(proc)
|
||||
break
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
continue
|
||||
return processes
|
||||
|
||||
|
||||
def stop_process_gracefully(pid, timeout=5):
|
||||
"""优雅地停止进程"""
|
||||
try:
|
||||
proc = psutil.Process(pid)
|
||||
|
||||
# 发送 SIGTERM
|
||||
proc.terminate()
|
||||
|
||||
# 等待
|
||||
try:
|
||||
proc.wait(timeout=timeout)
|
||||
return True
|
||||
except psutil.TimeoutExpired:
|
||||
# 发送 SIGKILL
|
||||
proc.kill()
|
||||
proc.wait(timeout=2)
|
||||
return True
|
||||
except psutil.NoSuchProcess:
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"停止进程 {pid} 失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def test_service_stopping(service_name, keywords, stop_commands=None):
|
||||
"""测试服务停止"""
|
||||
print(f"\n测试停止 {service_name}...")
|
||||
|
||||
# 查找进程
|
||||
processes = find_processes(keywords)
|
||||
print(f" 找到 {len(processes)} 个进程")
|
||||
|
||||
if processes:
|
||||
for proc in processes:
|
||||
print(f" PID {proc.pid}: {proc.info.get('name', 'unknown')}")
|
||||
|
||||
# 执行停止命令
|
||||
if stop_commands:
|
||||
for cmd in stop_commands:
|
||||
print(f" 执行命令: {cmd}")
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd, shell=True, capture_output=True, text=True, timeout=10
|
||||
)
|
||||
print(f" 返回码: {result.returncode}")
|
||||
if result.stdout:
|
||||
print(f" 输出: {result.stdout[:100]}...")
|
||||
except Exception as e:
|
||||
print(f" 错误: {e}")
|
||||
|
||||
# 等待
|
||||
time.sleep(3)
|
||||
|
||||
# 检查剩余进程
|
||||
remaining = find_processes(keywords)
|
||||
if remaining:
|
||||
print(f" ❌ {service_name} 仍有 {len(remaining)} 个进程在运行")
|
||||
return False
|
||||
else:
|
||||
print(f" ✅ {service_name} 已停止")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("改进的关机机制测试")
|
||||
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print("=" * 60)
|
||||
|
||||
# 测试的服务列表
|
||||
test_services = [
|
||||
{
|
||||
"name": "Redis",
|
||||
"keywords": ["redis-server"],
|
||||
"stop_commands": ["redis-cli shutdown"],
|
||||
},
|
||||
{
|
||||
"name": "PostgreSQL",
|
||||
"keywords": ["postgres"],
|
||||
"stop_commands": [
|
||||
"pg_ctl -D /Users/accusys/momentry/var/postgresql stop -m fast"
|
||||
],
|
||||
},
|
||||
{
|
||||
"name": "AI 处理器",
|
||||
"keywords": ["asr_processor", "cut_processor"],
|
||||
"stop_commands": None,
|
||||
},
|
||||
{
|
||||
"name": "Momentry 服务",
|
||||
"keywords": ["momentry server", "momentry worker"],
|
||||
"stop_commands": None,
|
||||
},
|
||||
]
|
||||
|
||||
results = []
|
||||
|
||||
# 运行测试
|
||||
for service in test_services:
|
||||
success = test_service_stopping(
|
||||
service["name"], service["keywords"], service.get("stop_commands")
|
||||
)
|
||||
results.append((service["name"], success))
|
||||
|
||||
# 显示结果
|
||||
print("\n" + "=" * 60)
|
||||
print("测试结果")
|
||||
print("=" * 60)
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
for service_name, success in results:
|
||||
if success:
|
||||
print(f"✅ {service_name}: 通过")
|
||||
passed += 1
|
||||
else:
|
||||
print(f"❌ {service_name}: 失败")
|
||||
failed += 1
|
||||
|
||||
print(f"\n总计: {passed} 通过, {failed} 失败")
|
||||
|
||||
# 建议
|
||||
if failed > 0:
|
||||
print("\n建议改进:")
|
||||
print("1. 增加停止命令的超时时间")
|
||||
print("2. 添加 sudo 权限支持")
|
||||
print("3. 实现进程树停止(父进程+子进程)")
|
||||
print("4. 添加强制停止选项(SIGKILL)")
|
||||
|
||||
return passed == len(results)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
success = main()
|
||||
sys.exit(0 if success else 1)
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n测试被用户中断")
|
||||
sys.exit(130)
|
||||
except Exception as e:
|
||||
print(f"\n错误: {e}")
|
||||
sys.exit(1)
|
||||
Reference in New Issue
Block a user