diff --git a/APP_PROFILER/services/process.py b/APP_PROFILER/services/process.py index 620984b..327a05b 100644 --- a/APP_PROFILER/services/process.py +++ b/APP_PROFILER/services/process.py @@ -59,17 +59,31 @@ def control_service(action: str): return {"status": "error", "message": f"Failed to start OpenVPN: {str(e)}"} def stop_vpn_direct(): - stopped = False + procs_to_stop = [] for proc in psutil.process_iter(['name']): if proc.info['name'] == 'openvpn': - proc.terminate() - stopped = True + try: + proc.terminate() + procs_to_stop.append(proc) + except (psutil.NoSuchProcess, psutil.AccessDenied): + pass + + if procs_to_stop: + # Wait for processes to actually exit + logger.info(f"[PROCESS] Waiting for {len(procs_to_stop)} OpenVPN process(es) to terminate...") + gone, alive = psutil.wait_procs(procs_to_stop, timeout=5) + for p in alive: + try: + logger.warning(f"[PROCESS] Process {p.pid} did not terminate, killing...") + p.kill() + except: + pass if os.path.exists(PID_FILE): try: os.remove(PID_FILE) except: pass - if stopped: + if procs_to_stop: return {"status": "success", "message": "OpenVPN stopped successfully"} else: return {"status": "success", "message": "OpenVPN was not running"} @@ -78,7 +92,6 @@ def control_service(action: str): elif action == "stop": return stop_vpn_direct() elif action == "restart": stop_vpn_direct() - time.sleep(1) return start_vpn_direct() # On Host OS: Use system service manager