我正在寻找一个解决方案,以确定我的.jar是否已经在运行。但是,我需要这个能够在Windows,RedHat,Solaris,OEL等上工作。在perl中的解决方案会很棒。但是,我也可以尝试一个调用jar的解决方案,然后在主类中检查另一个jar是否已经在运行(如果是,则关闭)。我使用java -jar
我查看了以下内容:How can I check if a Unix process is running in Perl?但它似乎不适用于Windows。
我也看过这篇文章:Using Perl, how do I check if a process with given name is running or not?但这只适用于Windows。
我想在确定运行jar的操作系统之后可以使用两者的组合,但是我正在寻找一个“更清洁”的选项。
任何帮助都会很棒。
答案 0 :(得分:4)
使用jdk附带的java进程状态工具:jps
。它列出了正在运行的内容,如果程序像java -jar start.jar
一样启动,它将显示jar文件的名称:
root@MYBOX:/opt/jetty/logs# jps
31557 start.jar
1891 Jps
您可以围绕jps
构建脚本以查看您的jar是否已在运行
您可以提供其他选项jps
来打印更多或更少的数据:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
答案 1 :(得分:3)
一个简单的解决方案是在文本文件或数据库中写入程序的状态,并在想知道应用程序的状态时读取它。
正如乔治所提到的那样,每隔一秒写一次文本文件(例如)可以让你轻松看到程序是否被卡住了,如果没有写入,比方说,最后5秒。
此外,文本文件与操作系统无关: - )
答案 2 :(得分:0)
Java可以直接运行jar
(java -jar foo.jar
),也可能是jar包含正在运行的Java程序所需的类。
第一个很容易。您可以使用jps
来显示所有正在运行的Java命令。
第二个更难。您甚至不能依赖$CLASSPATH
的值或查看执行Java程序时-cp
参数的内容。可以在该类路径中提及jar,但不需要,或者在正在使用的一个jar中嵌入的META-INF/MANIFEST.MF
文件的类路径中提到jar。