2011-11-23 26 views
2

我的目标是向STDOUT列出在Linux服务器上由java执行的类文件和.jar文件。我可以做一些getopts的东西来获得参数-jar,但其他进程标识为从Linux的ps输出中确定运行的类和jar's

ps -ef | grep java或ps -eo args | grep java

可能正在执行一个类文件,例如, java -classpath/a/b/c myclass A1 A2。我担心的是,我正在寻找一个不合理的解决方案,这个解决方案充满了greps和awk的冗长管道来解决应该(我认为)一个简单的查询。鉴于:

  1. 一些调用来只是“的Java”和其他人对Java的完全合格的路径名,

  2. 各种不同(或没有)Java选项可以在命令设置线运行的进程,

  3. 一些过程调用.jar文件,一些通话.class文件,并

  4. 可能会有参数传递给类,

什么是让运行Java可执行文件,比如一个简单的列表的最佳方式:

abc.jar

mymainclass

xyz.jar

numainclass

我认为这可能不是一个不常见的问题,但我似乎无法建立一个搜索字符串来查找以前的任何讨论。一个优雅的解决方案会很好,现在我正在寻找grep'-jar'条目到getops调用,并且考虑所有可能的组合来解析剩余的条目。我正在使用bash 3.x解决方案。

谢谢!

+0

您可以使用JDK附带的JVisualVM [http://visualvm.java.net/description.html](http://visualvm.java.net/description.html)。但是,您需要在您的应用程序中设置JMX支持,请参阅给定链接中的“在目标VM中启用JMX访问”部分 – ecle

回答

5

在jdk5中引入的jps命令可能是您正在寻找的。使用-l-m选项它将输出pid主类和参数。添加-v将添加vm参数。

+0

我们实际上最终编写了一个bash解析器,但如果我们没有这样做,选择的解决方案。谢谢Jorn。 – cvsdave

0

此选项列出当前所有的Java文件打开通过java命令。也许它对你有用。

lsof | grep -E "^java.*(.jar|.class)$" | sed -E "s/\s+/\t/g" | cut -f9 

它在Debian中有效。