我有一个Java应用程序,它使用Apache Daemon服务安装程序将其注册为Windows服务。我正在使用Puppet来运行一个exec {}块来注册服务,它可以工作,然后链接一个service {}块来启动服务。 Puppet使用“net.exe start”来运行该服务,但该命令报告错误,即使该服务正确启动。
在PowerShell shell中运行命令的输出是:
--admission-controllers
在此命令运行时刷新Windows服务面板时,我看到状态更改为:
空白字段 - >开始 - >开始
这是由apache包装器引起的问题,它是在单独的shell中启动jvm还是其他一些副作用?而且,更重要的是,我可以在Puppet中解决这个问题,同时仍然使用service {}块吗?是否可以替换sc.exe,它没有遇到同样的问题,缺少使用exec {}块?
答案 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提供反馈,但不会比使用net start
代替{{1 }}
答案 2 :(得分:0)
解释是该服务需要很长时间才能启动,并且无法与启动器正确通信。
当您编写启动通信或数据库连接的服务时,您必须与服务控制管理器(SCM)进行通信,以提供您正在启动的信息。做这种"我还在开始留言" SCM可以等待你需要开始的时间。但是很多服务编写器或工具将exe文件封装为服务会忽略它,因此无法启动SCM返回"服务"。在Win32中,这由SetServiceStatus函数处理,你将在那里获得很多细节。