为什么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
.
我有一个 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
.