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>
|
/// <returns>List of child process PIDs</returns>
|
||||||
public static List<int> GetChildPids(int pid)
|
public static List<int> GetChildPids(int pid)
|
||||||
{
|
{
|
||||||
var searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
|
var childPids = new List<int>();
|
||||||
var childPids = new List<int>();
|
|
||||||
foreach (var mo in searcher.Get())
|
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.Warn("Failed to locate children of the process with PID=" + pid + ". Child processes won't be terminated", ex);
|
||||||
Logger.Info("Found child process: " + childProcessId + " Name: " + mo["Name"]);
|
|
||||||
childPids.Add(Convert.ToInt32(childProcessId));
|
|
||||||
}
|
}
|
||||||
return childPids;
|
|
||||||
|
return childPids;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// <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)
|
public static void StopProcessAndChildren(int pid, TimeSpan stopTimeout, bool stopParentProcessFirst)
|
||||||
{
|
{
|
||||||
List<int> childPids = null;
|
if (!stopParentProcessFirst)
|
||||||
try
|
{
|
||||||
{
|
foreach (var childPid in GetChildPids(pid))
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
|
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
|
||||||
}
|
}
|
||||||
|
@ -110,9 +108,9 @@ namespace winsw.Util
|
||||||
|
|
||||||
StopProcess(pid, stopTimeout);
|
StopProcess(pid, stopTimeout);
|
||||||
|
|
||||||
if (stopParentProcessFirst && childPids != null)
|
if (stopParentProcessFirst)
|
||||||
{
|
{
|
||||||
foreach (var childPid in childPids)
|
foreach (var childPid in GetChildPids(pid))
|
||||||
{
|
{
|
||||||
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
|
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,9 @@ namespace winsw.Util
|
||||||
|
|
||||||
process.WaitForExit((int)shutdownTimeout.TotalMilliseconds);
|
process.WaitForExit((int)shutdownTimeout.TotalMilliseconds);
|
||||||
|
|
||||||
|
// Detach from console. Causes child console process to be automatically closed.
|
||||||
|
FreeConsole();
|
||||||
|
|
||||||
return process.HasExited;
|
return process.HasExited;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue