从相同的Windows服务重新启动Windows服务

时间:2014-01-25 00:37:04

标签: c#

我正在尝试使用以下代码从相同的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();

它不起作用,但是这可能来自同一个服务吗?

如果有可能,那么任何人都可以建议为什么这不起作用?

3 个答案:

答案 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将再次启动。