如何获得请求重启的服务?

时间:2013-03-05 03:31:07

标签: .net windows service

如何重启Windows服务请求?我知道Environment.Exit(1)与恢复选项服务设置一起使用,但如果服务真的出错了该怎么办?

背景

我们有一堆Windows服务使用自治组件作为我们SOA架构的一部分。我们希望在自治组件更新时重新启动服务,但我们不希望每天重新启动两次(发布),并且如果出现真正的错误,我们不希望服务无限期地重新启动。

2 个答案:

答案 0 :(得分:2)

我创建了许多使用此技术的自我更新服务。我发现依赖恢复选项并不理想,因为它经常让系统管理员觉得你的服务在他们的机器上轰炸(写入事件日志,由于意外的服务停止而发生服务恢复)。

我在我的案例中所做的是,在服务的安装过程中创建的帐户下,启动了一个特制的可执行文件。该帐户被拒绝登录权限,并且仅控制我们的特定服务(使用icacals或等效的授予服务控制权限)。可执行文件已启动,它使用一些预定义的OnCustomCommand service commands与服务进行通信,告知服务它已更新,它需要完成它的操作,并尽快关闭尽可能。可执行文件在给定时间内等待,一旦服务停止,它就会在二进制文件中移动,并执行许多其他自定义步骤,然后启动服务备份并退出。

我确信有更干净的方法可以做到这一点,但是在找了几个小时之后我没有想出任何更干净的东西后我决定这样做会对我们的情况有用。我在大量计算机上使用的这几年没有遇到任何问题,除了由于管理员弄乱可执行文件运行的用户帐户而导致的偶然的权限问题。

答案 1 :(得分:1)

我们做到了这一点:

using System.Diagnostics;

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\"");

看来Process.Start()要么不创建子进程,要么在父进程死亡时不会终止子进程。

请注意,进程运行的用户必须具有启动和停止进程的权限。