4

我试图在 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
4

2 回答 2

6

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

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

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

你可以试试:

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

还有一个工具叫做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 工作来避免它。

于 2013-03-14T15:50:35.050 回答
2

第一个是正确的。第二,你的 shell 会*.java根据你当前的工作目录进行扩展,结果很有趣。

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

ps -ef | grep bar.java foo.java

我相信,它只会在foo.java中搜索 bar.java,而忽略来自ps. 但不要引用我的话——关键是它几乎肯定不是你想要的。

于 2013-03-14T15:40:10.780 回答