如何让 Windows 服务请求重新启动?我知道Environment.Exit(1)
与“恢复选项”服务设置一起使用,但如果该服务真的出错了怎么办?
背景:
我们有一堆 Windows 服务,它们使用自治组件作为我们 SOA 架构的一部分。我们希望在自治组件更新时重新启动服务,但我们不希望被限制为每天两次重新启动(发布),并且我们不希望服务在出现真正错误时无限期地重新启动。
我创建了许多使用这种技术的自我更新服务。我发现依赖恢复选项并不理想,因为它经常让系统管理员感觉你的服务在他们的机器上被炸毁了(写入事件日志表明服务恢复是由于意外的服务停止而发生的)。
在我的案例中,我所做的虽然很老套但很有效,就是在服务安装期间创建的帐户下启动一个专门制作的可执行文件。该帐户被拒绝登录权限,并且只能控制我们的特定服务(使用 icacals 或等效授予服务控制权限)。可执行文件被启动,它使用一些预定义的OnCustomCommand
服务命令与服务通信,这些命令告诉服务它已经更新,它需要完成它正在做的事情,并尽快关闭。可执行文件等待给定时间,一旦服务停止,它会在二进制文件中移动,并执行许多其他自定义步骤,然后重新启动服务并退出。
我确信有更清洁的方法可以做到这一点,但是在寻找了几个小时后未能提出任何更清洁的方法后,我决定这将适用于我们的案例。多年来,我在大量计算机上都没有遇到过任何问题,除了由于管理员弄乱了运行可执行文件的用户帐户而导致的偶尔权限问题。
我们解决了这个问题:
using System.Diagnostics;
Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\"");
似乎Process.Start()
要么没有创建子进程,要么在父进程死亡时子进程没有被杀死。
请注意,运行该进程的用户必须具有启动和停止该进程的权限。