我们有一个自定义应用程序,它与大量第三方资源混在一起。终止时,我们需要优雅地“放弃租约”。
应用程序本身是用 .NET Core 编写的(目标是实现真正的多平台运行能力)。我们ExecStop
在 Linux 中使用 Systemd 的机制来调用我们的自定义帮助脚本(myapp cli shutdown
)。
该帮助脚本也存在于 Windows 中,但我们不确定如何将其与 Windows 的服务管理真正结合起来。我们使用 NSSM 来保持服务本身持续运行,但如果可以实现这一点,我们也愿意接受其他选择。
我尝试在 Google/StackExchange 上搜索有关 Windows 上的自定义停止命令,但一无所获。
有人知道我们怎样才能实现这个目标吗?
答案1
NSSM“关机”选项卡设置控制服务收到停止请求时发生的情况。Control-C 和 Terminate process 选项不太可能有用,但由于您的应用程序在 .NET 中,因此它应该能够接收和响应WM_CLOSE
和/或WM_QUIT
。我想这在 .NET Core 中也是可能的,尽管我不确定细节。
这Apache Commons Daemon可能更适合您。虽然它主要针对用 Java 编写的服务而设计,但它也可以运行任意可执行文件,并且该--StopImage
选项允许您在服务收到停止请求时运行命令行。
但是,如果应用程序实际上是一个服务,而不是使用第三方包装器(如 NSSM 或 Apache Commons Daemon),那就更优雅了。这在 .NET 中很容易,在 .NET Core 中则更难,但谷歌搜索后发现如何使用 Visual Studio 2017 创建 .NET Core Windows 服务它应该可以帮助您入门。
如果您需要有关直接实现服务的更多详细信息,您应该在 Stack Overflow 上询问,因为这更多是关于 Windows 编程而不是系统管理。