mirror of https://github.com/winsw/winsw
				
				
				
			Fixes #95 - Service not sending SIGINT properly to java
Detach from console process after sending SIGINT to java. Note: we still need <stopparentprocessfirst> to be set to true, so the parent (java) process is shut down first. Moved exception handling to GetChildPids. StopProcessAndChildren now gets a fresh list of childPids after stopping a parent process, as that may have caused some child processes to terminate.pull/186/head
							parent
							
								
									e7aff3a434
								
							
						
					
					
						commit
						dc42c73fab
					
				|  | @ -22,15 +22,23 @@ namespace winsw.Util | |||
|         /// <returns>List of child process PIDs</returns> | ||||
|         public static List<int> GetChildPids(int pid) | ||||
|         { | ||||
|             var searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid); | ||||
|             var childPids = new List<int>(); | ||||
|             foreach (var mo in searcher.Get()) | ||||
| 			var childPids = new List<int>(); | ||||
| 			 | ||||
| 			try { | ||||
| 				var searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid); | ||||
| 				foreach (var mo in searcher.Get()) | ||||
| 				{ | ||||
| 					var childProcessId = mo["ProcessID"]; | ||||
| 					Logger.Info("Found child process: " + childProcessId + " Name: " + mo["Name"]); | ||||
| 					childPids.Add(Convert.ToInt32(childProcessId)); | ||||
| 				} | ||||
| 			} | ||||
| 			catch (Exception ex) | ||||
|             { | ||||
|                 var childProcessId = mo["ProcessID"]; | ||||
|                 Logger.Info("Found child process: " + childProcessId + " Name: " + mo["Name"]); | ||||
|                 childPids.Add(Convert.ToInt32(childProcessId)); | ||||
|                 Logger.Warn("Failed to locate children of the process with PID=" + pid + ". Child processes won't be terminated", ex); | ||||
|             } | ||||
|             return childPids; | ||||
|              | ||||
| 			return childPids; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -90,19 +98,9 @@ namespace winsw.Util | |||
|         /// <param name="stopParentProcessFirst">If enabled, the perent process will be terminated before its children on all levels</param> | ||||
|         public static void StopProcessAndChildren(int pid, TimeSpan stopTimeout, bool stopParentProcessFirst) | ||||
|         { | ||||
|             List<int> childPids = null; | ||||
|             try | ||||
|             { | ||||
|                 childPids = GetChildPids(pid); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Logger.Warn("Failed to locate children of the process with PID=" + pid + ". Child processes won't be terminated", ex); | ||||
|             } | ||||
| 
 | ||||
|             if (!stopParentProcessFirst && childPids != null) | ||||
|             {   | ||||
|                 foreach (var childPid in childPids) | ||||
| 			if (!stopParentProcessFirst) | ||||
|             {          | ||||
|                 foreach (var childPid in GetChildPids(pid)) | ||||
|                 { | ||||
|                     StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst); | ||||
|                 } | ||||
|  | @ -110,9 +108,9 @@ namespace winsw.Util | |||
| 
 | ||||
|             StopProcess(pid, stopTimeout); | ||||
| 
 | ||||
|             if (stopParentProcessFirst && childPids != null) | ||||
|             if (stopParentProcessFirst) | ||||
|             { | ||||
|                 foreach (var childPid in childPids) | ||||
|                 foreach (var childPid in GetChildPids(pid)) | ||||
|                 { | ||||
|                     StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst); | ||||
|                 } | ||||
|  |  | |||
|  | @ -49,6 +49,9 @@ namespace winsw.Util | |||
| 
 | ||||
|                 process.WaitForExit((int)shutdownTimeout.TotalMilliseconds); | ||||
| 
 | ||||
|                 // Detach from console. Causes child console process to be automatically closed. | ||||
|                 FreeConsole(); | ||||
| 				 | ||||
|                 return process.HasExited;     | ||||
|             } | ||||
|           | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 madargs
						madargs