我试图在 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
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 工作来避免它。
第一个是正确的。第二,你的 shell 会*.java
根据你当前的工作目录进行扩展,结果很有趣。
这些结果到底是什么......我在这里猜测,但假设你有文件foo.java
并且bar.java
在你当前的目录中,后者实际上正在做:
ps -ef | grep bar.java foo.java
我相信,它只会在foo.java中搜索 bar.java,而忽略来自关键是它几乎肯定不是你想要的。ps
. 但不要引用我的话——