C# Windows 服务 - 停止后的僵尸进程
C# Windows service - zombie process after stopping
我在 C# (.NET Framework 4.5) 上编写 Windows 服务。
停止服务后,他的进程变成了僵尸进程(他不会被 "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 Resource Monitor":
在 "Assotsiated Handles" 部分中,我找到了行:
\Device\Mup$COMPUTERNAME\PIPE\winreg
这些是 $COMPUTERNAME 已经断开连接的机器,交互完成。
这些台词是什么?这可能是僵尸进程的原因吗?
在服务代码中,我使用 Process.GetProcesses 获取远程机器上 运行ning 进程的列表:
var remoteProcesses = Process.GetProcesses(remote_client_name);
机器关机后,Process.GetProcesses是否可以保留一些资源不关闭?
实际的方法已经揭示了僵尸进程的原因是调用:
var remoteProcesses = Process.GetProcesses(remote_client_name);
在我的服务中,有必要在关闭远程机器之前检查 运行 进程。
显然 "GetProcesses()" 使用管道通道发送请求并且没有时间在关闭机器之前正确关闭它们。
无论如何,从服务代码中删除它后立即断开连接。
我在 C# (.NET Framework 4.5) 上编写 Windows 服务。 停止服务后,他的进程变成了僵尸进程(他不会被 "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 Resource Monitor":
\Device\Mup$COMPUTERNAME\PIPE\winreg
这些是 $COMPUTERNAME 已经断开连接的机器,交互完成。
这些台词是什么?这可能是僵尸进程的原因吗?
在服务代码中,我使用 Process.GetProcesses 获取远程机器上 运行ning 进程的列表:
var remoteProcesses = Process.GetProcesses(remote_client_name);
机器关机后,Process.GetProcesses是否可以保留一些资源不关闭?
实际的方法已经揭示了僵尸进程的原因是调用:
var remoteProcesses = Process.GetProcesses(remote_client_name);
在我的服务中,有必要在关闭远程机器之前检查 运行 进程。
显然 "GetProcesses()" 使用管道通道发送请求并且没有时间在关闭机器之前正确关闭它们。
无论如何,从服务代码中删除它后立即断开连接。