From 5392766c5ef8e0ffe92c16fd4aebec8dee1af2df Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 3 Jan 2025 15:01:30 +0800 Subject: [PATCH] Improved KillProcess --- v2rayN/ServiceLib/Handler/CoreHandler.cs | 47 ++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/v2rayN/ServiceLib/Handler/CoreHandler.cs b/v2rayN/ServiceLib/Handler/CoreHandler.cs index 0a212e0a..8c5b46ca 100644 --- a/v2rayN/ServiceLib/Handler/CoreHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreHandler.cs @@ -15,6 +15,7 @@ namespace ServiceLib.Handler private Process? _processPre; private int _linuxSudoPid = -1; private Action? _updateFunc; + private const string _tag = "CoreHandler"; public async Task Init(Config config, Action updateFunc) { @@ -97,12 +98,14 @@ namespace ServiceLib.Handler { if (_process != null) { - _process = await KillProcess(_process); + await KillProcess(_process, true); + _process = null; } if (_processPre != null) { - _processPre = await KillProcess(_processPre); + await KillProcess(_processPre, true); + _processPre = null; } if (_linuxSudoPid > 0) @@ -113,7 +116,7 @@ namespace ServiceLib.Handler } catch (Exception ex) { - Logging.SaveLog(ex.Message, ex); + Logging.SaveLog(_tag, ex); } } @@ -121,11 +124,11 @@ namespace ServiceLib.Handler { try { - await KillProcess(Process.GetProcessById(pid)); + await KillProcess(Process.GetProcessById(pid), false); } catch (Exception ex) { - Logging.SaveLog(ex.Message, ex); + Logging.SaveLog(_tag, ex); } } @@ -206,7 +209,7 @@ namespace ServiceLib.Handler } catch (Exception ex) { - Logging.SaveLog(ex.Message, ex); + Logging.SaveLog(_tag, ex); ShowMsg(false, ex.Message); return -1; } @@ -315,25 +318,39 @@ namespace ServiceLib.Handler } catch (Exception ex) { - Logging.SaveLog(ex.Message, ex); + Logging.SaveLog(_tag, ex); ShowMsg(true, ex.Message); return null; } } - private async Task KillProcess(Process? proc) + private async Task KillProcess(Process? proc, bool review) { if (proc is null) { - return null; + return; } - try { proc?.Kill(true); } catch (Exception ex) { Logging.SaveLog(ex.Message, ex); } - try { proc?.Kill(); } catch (Exception ex) { Logging.SaveLog(ex.Message, ex); } - try { proc?.Close(); } catch (Exception ex) { Logging.SaveLog(ex.Message, ex); } - try { proc?.Dispose(); } catch (Exception ex) { Logging.SaveLog(ex.Message, ex); } - await Task.Delay(100); - return null; + var fileName = proc?.MainModule?.FileName; + var processName = proc?.ProcessName; + + try { proc?.Kill(true); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try { proc?.Kill(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try { proc?.Close(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try { proc?.Dispose(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } + + await Task.Delay(500); + if (review) + { + var proc2 = Process.GetProcessesByName(processName) + .FirstOrDefault(t => t.MainModule?.FileName == fileName); + if (proc2 != null) + { + Logging.SaveLog($"{_tag}, KillProcess not completing the job"); + await KillProcess(proc2, false); + proc2 = null; + } + } } #endregion Process