C#Windows服务 - 停止

时间:2015-09-16 06:17:19

标签: c# service ssh zombie-process

我在C#(.NET Framework 4.5)上编写Windows服务。 停止服务后,他的过程变成了一个僵尸进程(他没有被“taskkill”杀死)。

enter image description here

大约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资源监视器”enter image description here 在“Assotsiated Handles”部分中,我找到了行:

\Device\Mup\$COMPUTERNAME\PIPE\winreg

这些是已经断开连接的 $ COMPUTERNAME 计算机,完成了交互。

这些线是什么?这可能是僵尸进程的原因吗?

在服务代码中,我使用Process.GetProcesses获取远程mashine上运行进程的列表:

var remoteProcesses = Process.GetProcesses(remote_client_name);

如果机器关闭, Process.GetProcesses 是否可以保留一些资源未关闭?

1 个答案:

答案 0 :(得分:0)

实践方式已经揭示出僵尸进程的原因是:

var remoteProcesses = Process.GetProcesses(remote_client_name); 

在我的服务中,有必要在关机前检查远程机器上的运行进程。

显然" GetProcesses()"使用管道发送请求,没有时间在关闭机器之前正确关闭它们。

无论如何,在将其从服务代码中删除后,立即断开连接。