C# 从相同的windows服务重新启动windows服务
我正在尝试使用以下代码从同一windows服务重新启动windows服务:C# 从相同的windows服务重新启动windows服务,c#,C#,我正在尝试使用以下代码从同一windows服务重新启动windows服务: var psi = new ProcessStartInfo("net.exe", "stop " + serviceName); psi.WindowStyle = ProcessWindowStyle.Hidden; psi.UseShellExecute = true; psi.WorkingDirectory = En
var psi = new ProcessStartInfo("net.exe", "stop " + serviceName);
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = true;
psi.WorkingDirectory = Environment.SystemDirectory;
var st = Process.Start(psi);
st.WaitForExit();
psi = new ProcessStartInfo("net.exe", "start " + serviceName);
psi.UseShellExecute = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.WorkingDirectory = Environment.SystemDirectory;
st = Process.Start(psi);
st.WaitForExit();
它不起作用,但这是否可以从同一服务中实现
如果可能的话,那么有人能提出为什么这不起作用吗?它不起作用,因为一旦到达中间位置,执行就会停止,因为父进程和子进程都会退出:
/* Running */ var psi = new ProcessStartInfo("net.exe", "stop " + serviceName);
/* Running */ psi.WindowStyle = ProcessWindowStyle.Hidden;
/* Running */ psi.UseShellExecute = true;
/* Running */ psi.WorkingDirectory = Environment.SystemDirectory;
/* st stops svc */ var st = Process.Start(psi);
/* both exit */ st.WaitForExit();
/* never reached */ psi = new ProcessStartInfo("net.exe", "start " + serviceName);
/* never reached */ psi.UseShellExecute = true;
/* never reached */ psi.WindowStyle = ProcessWindowStyle.Hidden;
/* never reached */ psi.WorkingDirectory = Environment.SystemDirectory;
/* never reached */ st = Process.Start(psi);
/* never reached */ st.WaitForExit();
在windows中配置服务,使其在出现故障时重新启动,然后按照@StevieB的建议执行不干净的退出
将服务配置为在出现故障时以1000毫秒的延迟重新启动:
sc failure serviceName reset= 60 actions= restart/1000
我不相信有一个干净的方法可以做到这一点。一旦停止该服务,该流程就不再用于启动它 一种稍脏的解决方案: 您可以将服务配置为在出现错误时重新启动(例如,在安装/注册时) 然后,当您希望以编程方式重新启动时,请让您的服务因错误而退出,例如,通过调用:
Environment.Exit(-1)
或
注意:如果有更简洁的方式以编程方式执行此操作,则运行服务的帐户将需要权限才能重新启动服务。您遇到了死锁
net
正在等待您的服务结束,您正在使用st.WaitForExit()
等待net
结束
最后,net
放弃等待并关闭。然后您再次调用net
。但是您的服务从一开始就没有退出过,因此第二次net
调用看到服务已经启动,并且什么也不做
最后,返回主服务事件循环并查看停止请求,然后服务退出
您应该能够使用上述命令编写批处理文件,调用它,然后返回到事件循环。然后,第一个
net
将等待服务停止,第二个net
将再次启动它。您期望得到什么,实际发生了什么,以及到目前为止您做了哪些故障排除工作?我期望服务重新启动。我不知道如何将net命令的输出重定向到文件,因此我不知道发生了什么。它不会停止svc。@dagda1:您遇到了死锁net
正在等待您的服务结束,您正在使用st.WaitForExit()
等待net
结束。
Environment.FailFast("Service stopped because...")