ps -ef | grep java和ps -ef | grep * .java之间的区别

时间:2013-03-14 15:32:33

标签: unix grep

我试图在unix框中找到所有正在运行的java进程。

我很困惑
ps –ef|grep java

ps –ef|grep *.java

哪一个是正确的,具体的区别是什么?

PS:两者都返回不同的结果集

ps –ef|grep *.java

的输出
ps -ef | grep *.java
aaassa1  7507  2304  0 11:49 pts/4    00:00:00 grep *.java

2 个答案:

答案 0 :(得分:5)

grep只是文本匹配,它不知道进程名称或文件名等。

也就是说,如果你有一个名为likejava.py的python脚本,它也会在结果中出现。

回到你的问题,你的*.java不好,因为grep适用于正则表达式,而不是glob模式。

你可以尝试:

ps -ef|grep $(which java)这将列出java进程,但仅限于您的默认Java安装。如果安装了多个Java,例如使用java7的jboss,使用java6的tomcat和使用java5的eclipse,这将失败。

还有一个名为pgrep的工具。你可以尝试一下,例如

pgrep -l java

您可以man pgrep获取更多信息:

pgrep, pkill - look up or signal processes based on name and other attributes

编辑添加一个小的 ps .. | grep技巧

刚刚在问题中看到了你的输出:

输出中有grep *.java,这是一个很好的例子。 grep *.java不是java进程,但它有文本“java”。所以它就在那里。

你可以通过ps...|grep [j]ava为bash工作来避免它。

答案 1 :(得分:2)

第一个是正确的。在第二种情况下,您的shell会根据您当前的工作目录展开*.java,并获得有趣的结果。

这些结果到底是什么......我猜这里,但假设你当前目录中有foo.javabar.java文件,后者实际上是这样做的:

ps -ef | grep bar.java foo.java

其中我相信,只会在foo.java中搜索bar.java,忽略来自ps的管道输入。但请不要引用我 - ,重点是它几乎肯定不是你想要的。