Служба С# Windows - зомби-процесс после остановки

Пишу службу Windows на C# (.NET Framework 4.5). После остановки службы его процесс становится зомби-процессом (он не убивает по "taskkill").

введите здесь описание изображения

Заканчивается примерно через 3-15 минут: Чем дольше работает сервис, тем дольше длится процесс. В сервисе отладки правильная концовка и выход из всего видимого кода.

В работе выполняю удаленные команды по SSH. Я заметил, что выполнение таких команд - возможно, причина в зомбировании. Потому что после работы без запуска команд процесс сразу завершается.

Для выполнения SSH-команд я использую SSH.NET (http://sshnet.codeplex.com/ ):

public class RenciSSHExecute:ISSHExecutable 
{
    public string Execute(String host, String user, String password, String command)
    {
        string result = String.Empty;
        Guid guid = Guid.NewGuid();
        try
        {
            using (var client = new Renci.SshNet.SshClient(host, user, password))
            {
                client.Connect();
                Logger.Information("Send SSH command [{0}]: {1}.", guid.ToString(), command);
                var cmd = client.RunCommand(command);
                result = cmd.Result.Replace("\n", "");
                Logger.Information("Result SSH command [{0}]: {1}", guid.ToString(), result);
            }
        }
        catch (Exception e)
        {
            throw new Exception(String.Format("Failed execution ssh-command: {0} on {1}@{2}. Error message: {2}",
                command, user, host, e.Message));
        }      

        return result;
    }
}

В чем причина зомби и как это исправить?

ОБНОВЛЕНИЕ:

Я использую "Монитор ресурсов Windows": введите здесь описание изображения В разделе "Ассоциированные дескрипторы" нашел строки:

\Device\Mup\$COMPUTERNAME\PIPE\winreg

А это уже отключенные машины $COMPUTERNAME, взаимодействие с которыми завершено.

Что это за строки? Может ли это быть причиной зомби-процесса?

В коде службы я использую Process.GetProcesses для получения списка запущенных процессов на удаленной машине:

var remoteProcesses = Process.GetProcesses(remote_client_name);

Может ли Process.GetProcesses оставить некоторые ресурсы незакрытыми, если машина выключена?


person Stan Zeez    schedule 16.09.2015    source источник


Ответы (1)


Практическим путем было выявлено, что причиной зомби-процесса были вызовы:

var remoteProcesses = Process.GetProcesses(remote_client_name); 

В моей службе это необходимо для проверки запущенных процессов на удаленной машине перед ее выключением.

По-видимому, "GetProcesses()" использует каналы для отправки запроса и не успевает закрыть их должным образом перед выключением машины.

Так или иначе, после исключения его из кода услуга сразу отключилась.

person Stan Zeez    schedule 29.09.2015