Дочерний процесс убит, когда служба Windows остановлена

У меня есть небольшое консольное приложение С#, которое отслеживает некоторые настроенные процессы/приложения, это также консольные приложения С# и поддерживает их работу, поэтому запускает их в случае сбоя. Это работает хорошо, если я запускаю это консольное приложение монитора, выполняя исполняемый файл (в интерактивном режиме). Однако, если я установлю это приложение как службу Windows с помощью NSSM, отслеживаемые процессы будут уничтожены, когда служба будет остановлена, а это не то, чего я хочу.

Минимальный код для воспроизведения (этот код запускает дочерний процесс только один раз и вообще не отслеживает его):

Приложение для мониторинга:

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?

Спасибо


person Karel Bém    schedule 22.03.2018    source источник


Ответы (2)


NSSM имеет параметр конфигурации, который не уничтожает все дерево процессов при остановке службы.

Вы можете настроить это в пользовательском интерфейсе с помощью nssm.exe edit "my service name" или напрямую с помощью nssm.exe set "my service name" AppKillProcessTree 0.

person yaakov    schedule 22.03.2018

Попробуйте использовать startInfo.UseShellExecute = true; для "дочерних" процессов. Это выполнит процесс из оболочки как отдельный/независимый процесс.

person rory.ap    schedule 22.03.2018
comment
Я пробовал это сейчас, но безуспешно :( (Я также пробовал свойство CreateNoWindow и некоторые другие) - person Karel Bém; 22.03.2018