windows 服务停止时子进程被终止
Child process is killed when windows service is stopped
我有一个小型 C# 控制台应用程序,用于监视一些已配置的进程/应用程序,这些也是 C# 控制台应用程序,并让它们 运行ning 以便在它们崩溃时启动它们。如果我通过执行 exe 文件(在交互模式下)运行 这个监控控制台应用程序,它会很好地工作。但是,如果我使用 NSSM 将此应用安装为 windows 服务,则当服务停止时,受监视的进程将被终止,这不是我想要的。
重现的最少代码(这段代码只启动子进程一次,完全不监听):
监控应用:
class Program
{
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "..\..\..\TestApp\bin\debug\TestApp.exe";
Process.Start(startInfo);
Console.WriteLine("Process started");
Console.Read();
}
}
受监控的应用程序:
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("running...");
Thread.Sleep(3000);
}
}
有没有办法在 windows 服务停止后保留这些子进程 运行ning?
谢谢
尝试对 "child" 个进程使用 startInfo.UseShellExecute = true;
。这将从 shell 作为 separate/independent 进程执行进程。
NSSM 有一个配置选项,在停止服务时不会杀死整个进程树。
您可以在 UI 中使用 nssm.exe edit "my service name"
或直接使用 nssm.exe set "my service name" AppKillProcessTree 0
进行配置。
我有一个小型 C# 控制台应用程序,用于监视一些已配置的进程/应用程序,这些也是 C# 控制台应用程序,并让它们 运行ning 以便在它们崩溃时启动它们。如果我通过执行 exe 文件(在交互模式下)运行 这个监控控制台应用程序,它会很好地工作。但是,如果我使用 NSSM 将此应用安装为 windows 服务,则当服务停止时,受监视的进程将被终止,这不是我想要的。
重现的最少代码(这段代码只启动子进程一次,完全不监听):
监控应用:
class Program
{
static void Main(string[] args)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "..\..\..\TestApp\bin\debug\TestApp.exe";
Process.Start(startInfo);
Console.WriteLine("Process started");
Console.Read();
}
}
受监控的应用程序:
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("running...");
Thread.Sleep(3000);
}
}
有没有办法在 windows 服务停止后保留这些子进程 运行ning?
谢谢
尝试对 "child" 个进程使用 startInfo.UseShellExecute = true;
。这将从 shell 作为 separate/independent 进程执行进程。
NSSM 有一个配置选项,在停止服务时不会杀死整个进程树。
您可以在 UI 中使用 nssm.exe edit "my service name"
或直接使用 nssm.exe set "my service name" AppKillProcessTree 0
进行配置。