为什么net.exe start <servicename>服务启动的时候报错?

Why does net.exe start <servicename> report a failure when the service starts?

我有一个 Java 应用程序,它使用 Apache Daemon 服务安装程序将其注册为 Windows 服务。我正在使用 Puppet 到 运行 一个 exec{} 块来注册服务,这有效,然后链接一个 service{} 块来启动服务。 Puppet 使用 "net.exe start" 到 运行 服务,但该命令报告错误,即使服务正确启动也是如此。

运行在 powershellshell 中执行命令的输出是:

PS C:\ProgramData\PuppetLabs\puppet\etc\modules> net start myservice
The myservice_descriptive_name service is starting.....
The myservice_descriptive_name service could not be started.

More help is available by typing NET HELPMSG 3523.

当我在 运行ning 期间刷新 Windows 服务面板时,我看到状态从:

blank field -> starting -> started

这是由 apache 包装器引起的问题吗,它在单独的 shell 中启动 jvm 或其他一些副作用?而且,更重要的是,我能否在仍然使用 service{} 块的同时解决 Puppet 中的这个问题?是否可以替代 sc.exe,它不会遇到同样的问题,而不是使用 exec{} 块?

解释是服务启动时间过长,无法与启动器正确通信。

当您编写启动通信或数据库连接的服务时,您必须与服务控制管理器 (SCM) 通信以提供您正在启动的信息。执行这种 "I'am still starting message" SCM 可以等待您需要启动的时间。但是许多将 exe 文件封装为服务的服务编写器或工具忽略了这一点,因此 SCM return "service could not be started"。在 Win32 中,这是由 SetServiceStatus 函数处理的,您将在那里获得更多详细信息。

JPBlanc 的回答解释了为什么 net.exe 等待服务启动时超时,即使它最终启动了。您绝对可以尝试将 net.exe 调用换成 sc.exe(服务控制)。

我已经创建了一个工单来解决这个问题 - https://tickets.puppetlabs.com/browse/PUP-5475

如果您发现它在等待时也没有超时,请评论 and/or 提交包含更改的拉取请求。无论如何,最好使用比 net.exe 更好的东西。

按顺序回答问题:

  • net start 命令报告失败,因为服务似乎已挂起。

  • 是的,问题是由 Apache 包装器引起的。

具体来说,包装器告诉 Windows 它将在两秒内到达第一个检查点。由于 Java 代码似乎无法实现检查点或更改等待提示,这意味着服务必须在两秒内启动才能与 Windows 服务兼容规范.

(原则上,Windows 有权在此时终止您的服务。据我所知,Windows 的当前版本没有这样做,尽管它们可能会记录错误消息。)

  • 除了修改 Puppet 或(最好)Apache 包装器之外,唯一明显的解决方法是确保您的服务立即 "starts",而不是等待初始化完成。

这不太理想,因为这意味着如果 Puppet 确实无法初始化,则该服务无法向 Puppet 提供反馈,但并不比您建议使用 sc start 而不是 net start.