Пишу службу 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 оставить некоторые ресурсы незакрытыми, если машина выключена?