我有一个蚂蚁任务,在其中我想获得当前的进程ID(从命令行输入echo $PPID)。

我在Solaris上运行ksh,所以我认为我可以这样做:

<property environment="env" />
<target name="targ">
    <echo message="PID is ${env.PPID}" />
    <echo message="PID is ${env.$$}" />
</target>


但这是行不通的。变量不会被替换。结果是PPIDSECONDS和某些其他env变量不将其放入Ant的表示中。

接下来,我尝试一下:

<target name="targ">
    <exec executable="${env.pathtomyfiles}/getpid.sh" />
</target>


getpid.sh看起来像这样:

echo $$


这使我得到了生成的shell脚本的PID。更接近,但不是我真正需要的。

我只需要当前的进程ID,因此可以使用名称中的该值制作一个临时文件。有什么想法吗?

最佳答案

您可以使用Java进程监视工具JPS找到PID,然后可以过滤输出流,并在需要时杀死进程。看看这个tomcat pid kill脚本:

<target name="tomcat.kill" depends="tomcat.shutdown">
  <exec executable="jps">
    <arg value="-l"/>
    <redirector outputproperty="process.pid">
        <outputfilterchain>
            <linecontains>
              <contains value="C:\tomcat\tomcat_node5\bin\bootstrap.jar"/>
            </linecontains>
            <replacestring from=" C:\tomcat\tomcat_node5\bin\bootstrap.jar"/>
        </outputfilterchain>
    </redirector>
  </exec>
  <exec executable="taskkill" osfamily="winnt">
    <arg value="/F"/>
    <arg value="/PID"/>
    <arg value="${process.pid}"/>
  </exec>
  <exec executable="kill" osfamily="unix">
    <arg value="-9"/>
    <arg value="${process.pid}"/>
  </exec>
</target>

07-26 09:03