我正在尝试使用以下代码从相同的Windows服务重新启动Windows服务:
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();
它不起作用,但是这可能来自同一个服务吗?
如果有可能,那么任何人都可以建议为什么这不起作用?
答案 0 :(得分:0)
它不起作用,因为一旦你到达中间,执行就会停止,因为父进程和子进程都退出:
/* 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
答案 1 :(得分:0)
我不相信有这样做的干净方法。一旦停止服务,该过程就不再启动了。
一个稍微脏的解决方案: 您可以将服务配置为在出错时重新启动(例如,在安装/注册时)。
然后,如果要以编程方式重新启动,请将服务退出并显示错误,例如致电:
Environment.Exit(-1)
或
Environment.FailFast("Service stopped because...")
注意:如果有一种更简洁的方式以编程方式执行此服务,则运行该服务的帐户将需要权限才能重新启动该服务。
答案 2 :(得分:0)
你有一个僵局。 net
正在等待您的服务结束,并且您正在使用st.WaitForExit()
等待net
结束。
最终net
放弃等待并关闭。然后再次致电net
。但是你的服务从一开始就没有退出,所以第二次net
调用看到服务已经启动并且什么也没做。
最后,您返回主服务事件循环并查看停止请求,并退出您的服务。
您应该能够使用上述命令编写批处理文件,调用它并返回事件循环。然后第一个net
将等待服务停止,第二个net
将再次启动。