我试图在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
答案 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.java
和bar.java
文件,后者实际上是这样做的:
ps -ef | grep bar.java foo.java
其中我相信,只会在foo.java中搜索bar.java,忽略来自,重点是它几乎肯定不是你想要的。ps
的管道输入。但请不要引用我 -