我有一个ant任务,在其中我想从命令行获取当前进程ID(la echo $PPID
)。
我在Solaris上运行ksh
,所以我想我可以这样做:
<property environment="env" />
<target name="targ">
<echo message="PID is ${env.PPID}" />
<echo message="PID is ${env.$$}" />
</target>
但那不起作用;变量没有被替换。结果是PPID
,SECONDS
,并且某些其他env变量不会使其成为Ant的表示。
接下来我试试这个:
<target name="targ">
<exec executable="${env.pathtomyfiles}/getpid.sh" />
</target>
getpid.sh
看起来像这样:
echo $$
这让我得到了生成的shell脚本的PID。更接近,但不是我真正需要的。
我只想要当前的进程ID,因此我可以在名称中创建一个具有该值的临时文件。有什么想法吗?
答案 0 :(得分:6)
您可以使用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>
答案 1 :(得分:3)
为什么不直接使用tempfile
Ant任务?它完成了你真正想做的事情,同时隐藏了所有血腥的细节。
答案 2 :(得分:1)
你的第二种方法没有得到ANT的pid。将shell脚本更改为(我使用bash,我不知道ksh是否相同):
echo "$PPID"