- 添加PDMS软件配置,支持批处理文件启动方式 - 配置executable_path为pdms.bat,startup_args为["Design", "noconsole"] - 通过进程检测工具确定正确的进程名称:des.exe和PDMSConsole.exe - 新增check_pdms_processes.py进程检测工具,可自动识别PDMS进程 - 更新Readme.md和frontend-api-docs.md文档 - 支持与Creo、Revit一致的启动、停止、重启功能 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
import sys
|
||
import asyncio
|
||
import psutil
|
||
sys.path.append('app')
|
||
|
||
from core.process_monitor import process_monitor
|
||
|
||
async def detect_pdms_processes():
|
||
"""检测PDMS相关的所有进程"""
|
||
print("=== PDMS进程检测工具 ===")
|
||
print("请确保PDMS已经启动,然后按任意键继续...")
|
||
input()
|
||
|
||
print("\n正在扫描系统中的所有进程...")
|
||
|
||
# 获取所有进程
|
||
all_processes = []
|
||
pdms_related_processes = []
|
||
|
||
try:
|
||
for proc in psutil.process_iter(['pid', 'name', 'create_time', 'cmdline']):
|
||
try:
|
||
proc_info = proc.info
|
||
all_processes.append(proc_info)
|
||
|
||
# 查找可能与PDMS相关的进程
|
||
process_name = proc_info['name'].lower() if proc_info['name'] else ''
|
||
cmdline_list = proc_info.get('cmdline') or []
|
||
if not isinstance(cmdline_list, list):
|
||
cmdline_list = []
|
||
cmdline = ' '.join(str(arg) for arg in cmdline_list).lower()
|
||
|
||
# 检查进程名或命令行中是否包含PDMS关键词
|
||
pdms_keywords = ['pdms', 'aveva', 'design', 'plant']
|
||
|
||
if any(keyword in process_name for keyword in pdms_keywords) or \
|
||
any(keyword in cmdline for keyword in pdms_keywords):
|
||
pdms_related_processes.append({
|
||
'pid': proc_info['pid'],
|
||
'name': proc_info['name'],
|
||
'cmdline': cmdline_list,
|
||
'create_time': proc_info['create_time']
|
||
})
|
||
|
||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||
continue
|
||
|
||
except Exception as e:
|
||
print(f"❌ 进程扫描失败: {e}")
|
||
return
|
||
|
||
print(f"\n📊 扫描结果:")
|
||
print(f" 总进程数: {len(all_processes)}")
|
||
print(f" PDMS相关进程数: {len(pdms_related_processes)}")
|
||
|
||
if not pdms_related_processes:
|
||
print("\n⚠️ 未找到PDMS相关进程!")
|
||
print(" 请确认:")
|
||
print(" 1. PDMS是否已正确启动")
|
||
print(" 2. 是否以正确的参数启动 (Design noconsole)")
|
||
return
|
||
|
||
print(f"\n🔍 发现的PDMS相关进程:")
|
||
print("-" * 80)
|
||
for proc in pdms_related_processes:
|
||
cmdline_preview = ' '.join(str(arg) for arg in proc['cmdline'][:3]) if proc['cmdline'] else ''
|
||
print(f"PID: {proc['pid']:8} | 进程名: {proc['name']:20} | 命令行: {cmdline_preview}")
|
||
|
||
# 分析最有可能的主进程
|
||
print(f"\n🎯 进程分析建议:")
|
||
print("-" * 40)
|
||
|
||
main_candidates = []
|
||
for proc in pdms_related_processes:
|
||
name = proc['name'].lower() if proc['name'] else ''
|
||
cmdline_str = ' '.join(str(arg) for arg in proc['cmdline']).lower() if proc['cmdline'] else ''
|
||
|
||
# 评分系统:更可能是主进程的得分更高
|
||
score = 0
|
||
if 'pdms' in name:
|
||
score += 10
|
||
if 'design' in name:
|
||
score += 8
|
||
if 'design' in cmdline_str:
|
||
score += 5
|
||
if 'noconsole' in cmdline_str:
|
||
score += 3
|
||
if len(proc['cmdline']) > 1: # 有参数的进程更可能是主进程
|
||
score += 2
|
||
|
||
main_candidates.append((proc, score))
|
||
|
||
# 按分数排序
|
||
main_candidates.sort(key=lambda x: x[1], reverse=True)
|
||
|
||
if main_candidates:
|
||
top_candidate = main_candidates[0][0]
|
||
print(f"推荐的主进程: {top_candidate['name']} (PID: {top_candidate['pid']})")
|
||
|
||
# 生成配置建议
|
||
unique_names = list(set(proc['name'] for proc in pdms_related_processes))
|
||
print(f"\n📝 配置文件建议:")
|
||
print(f"建议将PDMS的 check_process_name 设置为:")
|
||
|
||
if len(unique_names) == 1:
|
||
print(f' check_process_name: "{unique_names[0]}"')
|
||
else:
|
||
print(f' check_process_name: {unique_names}')
|
||
|
||
print(f"\n详细进程名称列表:")
|
||
for i, name in enumerate(unique_names, 1):
|
||
print(f" {i}. {name}")
|
||
|
||
print(f"\n=== 检测完成 ===")
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(detect_pdms_processes()) |