如果尚未启动,则启动服务的Ant

时间:2016-02-04 07:15:20

标签: ant windows-services

我的要求是从Ant启动窗口服务。 这是我的代码:

<target name="copy">
    <exec executable="net">
        <arg value="START"/>
        <arg value="SomeService"/>          
    </exec>
</target>

如果尚未开始服务,它的效果非常好。但是如果服务已经开始,则返回异常 [exec]结果:2

1 个答案:

答案 0 :(得分:0)

(1)使用BAT文件:如Rao的注释中所述,您可以编写一个批处理文件来检查服务是否正在运行,如果不运行则启动它,如此处所述:{{ 3}}。可以在<exec>目标中使用ant命令来调用。


(2)仅使用ANT目标:或者,如果您不想使用额外的批处理文件,则可以通过带有{的ant目标调用适当的单行命令通过<exec>的{​​1}}语句。在我的示例中,服务名称是“ JBossEAP7”,这是需要替换您的服务名称的字符串。

cmd /C

此目标执行<target name="run-jboss-service-if-not-already-running"> <exec dir="bin/" executable="cmd" spawn="false" failonerror="true"> <arg value="/c"/> <arg value="&quot;for /f &quot;tokens=3 delims=: &quot; %H in ('&quot;sc query JBossEAP7 | findstr &quot;STATE&quot;&quot;') do if not &quot;%H&quot;==&quot;RUNNING&quot; net START JBossEAP7 &quot;" /> </exec> </target> ,该调用cmd来检查服务状态(如此处How to check if a service is running via batch file and start it, if it is not running?所述),如果状态不是{ {1}}。


(3)使用一系列ANT目标::如果您不一定要启动服务,而是想根据服务是否正在运行或是否有其他目标来做其他事情需要有条件地执行,则可以使用一系列依赖的sc query目标来实现此目标(在我的示例中,我仍在启动服务,但您可以做其他事情)。

net START

更多细节:

  • 第一个目标(RUNNING)再次运行ant语句,该语句执行<target name="check-jboss-service-running"> <exec executable="cmd" spawn="false" failonerror="false" resultproperty="service.result"> <arg value="/c"/> <arg value="&quot;for /f &quot;tokens=3 delims=: &quot; %H in ('&quot;sc query JBossEAP7 | findstr &quot;STATE&quot;&quot;') do if not &quot;%H&quot;==&quot;RUNNING&quot; exit /B 1&quot;" /> </exec> <condition property="jboss-service.running"> <equals arg1="0" arg2="${service.result}"/> </condition> </target> <target name="start-jboss-service" depends="check-jboss-service-running" unless="jboss-service.running"> <exec executable="net" spawn="false" failonerror="true" resultproperty="net.result"> <arg value="START"/> <arg value="JBossEAP7"/> </exec> <condition property="jboss-service.running"> <equals arg1="0" arg2="${net.result}"/> </condition> </target> <target name="whatever-comes-next" depends="start-jboss-service" if="jboss-service.running"> <echo> JBoss service is running </echo> </target> ,该语句调用check-jboss-service-running以检查服务的状态。如果不是<exec>,则退出cmd,返回sc query。接下来,根据返回码,在RUNNING语句中是否设置属性cmd

  • 仅当未设置属性1时才执行第二个目标(jboss-service.running)。它启动服务,如果成功,则在<condition>语句中设置属性start-jboss-service

  • 服务运行后,第三个目标可以是接下来要执行的操作。仅当设置了属性jboss-service.running时才执行该操作,而该属性应该由第一个或第二个目标完成。


两句话:

(1)当然还有“ RUNNING”和“ STOPPED”以外的状态。因此,您的服务例如当前正在启动或关闭时,即使您可能不需要执行jboss-service.running命令。

(2)根据您正在检查或启动的服务,您可能需要引入延迟,以确保该服务所做的一切实际上已经启动并正在运行。例如。在我的示例中,JBoss可能正在运行,但是部署的Web应用程序响应之前需要花费更多时间。