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())