为什么net.exe启动<servicename>在服务启动时报告失败?

时间:2015-11-04 20:33:40

标签: java windows service puppet

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

在PowerShell shell中运行命令的输出是:

--admission-controllers

在此命令运行时刷新Windows服务面板时,我看到状态更改为:

  

空白字段 - &gt;开始 - &gt;开始

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

3 个答案:

答案 0 :(得分:1)

JPBlanc的回答解释了为什么net.exe在服务启动时超时,即使它最终启动了。您肯定可以尝试更换net.exe sc.exe来代替net.exe(服务控制)。

我已创建了一张解决此问题的故障单 - https://tickets.puppetlabs.com/browse/PUP-5475

如果您在等待时发现它也没有超时,请评论和/或提交包含更改的拉取请求。无论如何,使用优于name: "XXXXX", url: "page/{label}-{id}, defaults: new { controller = "Page", action = "Results", label= UrlParameter.Optional, id= UrlParameter.Optional }, 的东西将是首选。

答案 1 :(得分:1)

按顺序提出问题:

  • find_package(CURL) if(NOT ${CURL_FOUND}) message(WARNING "Could not find libcURL. This dependency will be downloaded. To avoid this you can install curl yourself using the standard methods for your platform.") ... endif() 命令报告失败,因为该服务似乎已挂起。

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

具体来说,包装器告诉Windows它将在两秒内到达第一个检查点。由于Java代码似乎没有任何方法可以实现检查点,或者更改等待提示,这意味着服务必须在两秒钟内启动才能符合Windows服务规范。

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

  • 如果不修改Puppet或(最好)Apache包装器,唯一明显的解决方法是确保您的服务“#34; start&#34;立即,而不是等待初始化完成。

这不太理想,因为这意味着如果服务确实无法初始化,服务无法向Puppet提供反馈,但不会比使用net start代替{{1 }}

答案 2 :(得分:0)

解释是该服务需要很长时间才能启动,并且无法与启动器正确通信。

当您编写启动通信或数据库连接的服务时,您必须与服务控制管理器(SCM)进行通信,以提供您正在启动的信息。做这种&#34;我还在开始留言&#34; SCM可以等待你需要开始的时间。但是很多服务编写器或工具将exe文件封装为服务会忽略它,因此无法启动SCM返回&#34;服务&#34;。在Win32中,这由SetServiceStatus函数处理,你将在那里获得很多细节。