exit_cursor.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import psutil
  2. from logger import logging
  3. import time
  4. def ExitCursor(timeout=5):
  5. """
  6. 温和地关闭 Cursor 进程
  7. Args:
  8. timeout (int): 等待进程自然终止的超时时间(秒)
  9. Returns:
  10. bool: 是否成功关闭所有进程
  11. """
  12. try:
  13. logging.info("开始退出Cursor...")
  14. cursor_processes = []
  15. # 收集所有 Cursor 进程
  16. for proc in psutil.process_iter(['pid', 'name']):
  17. try:
  18. if proc.info['name'].lower() in ['cursor.exe', 'cursor']:
  19. cursor_processes.append(proc)
  20. except (psutil.NoSuchProcess, psutil.AccessDenied):
  21. continue
  22. if not cursor_processes:
  23. logging.info("未发现运行中的 Cursor 进程")
  24. return True
  25. # 温和地请求进程终止
  26. for proc in cursor_processes:
  27. try:
  28. if proc.is_running():
  29. proc.terminate() # 发送终止信号
  30. except (psutil.NoSuchProcess, psutil.AccessDenied):
  31. continue
  32. # 等待进程自然终止
  33. start_time = time.time()
  34. while time.time() - start_time < timeout:
  35. still_running = []
  36. for proc in cursor_processes:
  37. try:
  38. if proc.is_running():
  39. still_running.append(proc)
  40. except (psutil.NoSuchProcess, psutil.AccessDenied):
  41. continue
  42. if not still_running:
  43. logging.info("所有 Cursor 进程已正常关闭")
  44. return True
  45. # 等待一小段时间再检查
  46. time.sleep(0.5)
  47. # 如果超时后仍有进程在运行
  48. if still_running:
  49. process_list = ", ".join([str(p.pid) for p in still_running])
  50. logging.warning(f"以下进程未能在规定时间内关闭: {process_list}")
  51. return False
  52. return True
  53. except Exception as e:
  54. logging.error(f"关闭 Cursor 进程时发生错误: {str(e)}")
  55. return False
  56. if __name__ == "__main__":
  57. ExitCursor()