【问题标题】:Windows service using nssm is working but not working with windows SC使用 nssm 的 Windows 服务正在运行,但不能与 Windows SC 一起使用
【发布时间】:2016-06-28 05:49:56
【问题描述】:

我应该将 GoLang 编译的文件 .exe 转换为 Windows 中的服务,但由于该服务是使用外部的 9 个参数执行的,所以我决定使用 SC 将 .exe 作为服务,我的语法是,

sc create myservice binPath= "\"PATH\file.exe\" -param1=value -param2=value -param3=value...-param9=value" displayname= "MyServer"  start= auto

服务创建成功,但是当我尝试启动它时,它失败了 “服务没有及时响应”..

但是当我使用 nssm 语法创建相同的服务时,

nssm install myservice "PATH\file.exe" -param1=value -param2=value -param3=value...-param9=value

它工作正常,我收到了我的服务的响应,我不知道问题出在 SC 中的语法还是我的服务...

我什至尝试了许多可能的方法,例如删除 \" 并直接提供参数,例如 binPath= "PATH/file.exe -param1=value -param2=value...param9=value" 但它不起作用,我也尝试在引号内传递参数,它也不起作用:(任何帮助将不胜感激。

【问题讨论】:

  • 我们需要查看代码。
  • 好吧@HarryJohnston 由于某些原因我无法发布代码,但我可以说代码中发生的过程。它获取机器的 CPU 使用率并在 HTTP POST 的帮助下将其发送到应用程序。应用程序需要我需要为我运行的每台机器提供的唯一数据,因此我将它们(唯一数据)作为外部参数(9 个参数)在 POST 中随 CPU 使用率发送。每 10 分钟它的 POST' ed 并且响应状态记录在日志文件中...
  • 这个问题不太可能与服务的目的有关,所以这并没有真正的帮助。当可执行文件未能调用 StartServiceCtrlDispatcher 或调用速度不够快时,会发生错误 1053。从外观上看,您可以在 Go 中通过调用 golang.org/x/sys/windows/svc 包中的 Run 函数来执行此操作。也许你的主函数没有调用Run就退出了,因为它不喜欢它给出的参数?
  • @HarryJohnston 谢谢你的点兄弟,但我猜这与 svc 包无关,因为它只处理已经是服务的包.. 我在这里试图做的只是转换一个exe 手动服务,而不是从 GO .. 是的,看起来 sc 不喜欢给它的参数..
  • 您已经说过sc 适用于您的其他可执行文件,因此这些可执行文件必须使用 svc 包或类似的包。 您不能直接在未构建为服务的可执行文件上使用 sc。这永远都行不通。(当然,您可以通过将sc 指向srvany.exenssm.exe 或等效项来间接使用sc。)

标签: windows windows-services nssm


【解决方案1】:

虽然 SC 很乐意将任何可执行文件安装为 Windows 服务,但它只能用于安装已经是 Windows 服务的可执行文件。如果您使用 SC 安装常规 exe,当您尝试启动服务时,您的服务将失败并显示 Error 1053。您的 Go exe 没有实现 Windows 服务接口,会成为这种情况的受害者。

【讨论】:

  • 但是我已经完成了使用 GO 编译的其他 .exe,并且它们在 SC 上运行良好 .. 只有这个 .exe 有 9 个参数难以启动,并且根据您的声明“它应该只用于安装已经是 Windows 服务的可执行文件”,你能解释一下吗?
  • 请注意,nssm 不能用于安装实际服务,它用于运行任意应用程序就好像它们是服务一样。如果nssmsc 都有效,那么您的可执行文件过于聪明,并且根据您的启动方式作为服务或应用程序运行。
  • 感谢您的信息,但我真的无法从服务和 exe 中得到区别。从互联网上,我可能理解服务是服务管理器监视下的 exe,而普通的 exe 在Windows 管理器监视...我仍然不清楚,因为它们都在执行...需要了解更多..
  • 您确定您的其他 Go 应用程序作为 Windows 服务正常工作吗?启动时,它们不会抛出错误 #1053?
  • @Kamikaze:一个普通的应用程序不必调用窗口管理器函数,除非它真的想呈现一个窗口,但是一个服务应用程序必须调用服务控制管理函数(如 StartServiceCtrlDispatcher)才能正常运行。如果没有,服务控制管理器会判断它已经挂起并终止它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多