使用ps aux命令获取进程ID

我是一个对shell编程新手。假设我已经从终端启动了一个程序(例如NetBeans),如果我输入
ps aux|grep netbeans

我得到了输出。
pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

其中18775指定了进程的PID等信息。
然后我使用以下命令将其终止。
kill 18775.

当我尝试使用第一个命令获取进程ID时,NetBeans用户界面消失了。
pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

如果进程已经被终止,为什么还会显示上述输出?

2这不是显示NetBeans进程,而是显示通过ps aux命令进行管道传输的grep进程!由于该进程是grep netbeans,所以你在行末看到的就是该程序(grep --color=auto netbeans)。 - David Puglielli
3个回答

grep正在对自身进行grep。尝试一些类似这样的操作:
ps aux |grep [n]etbeans

这样可以防止grep在输出中显示自身。

2这个方法可以用,但不太好看。你也可以用 ps aux | grep netbeans | grep -v grep。不过最好使用 pgrep 替代。 - Martin Ueding
1pgrep是一个不错的选择,但它只匹配进程名称。第一个模式可以匹配ps的任意列。(例如,在Python或Java下运行的程序,pgrep可能无法正确匹配。同样适用于pkill等等...) - Izkata

因为这是grep进程的PID,它在ps aux之后排队等待运行。

@ovangle- 眨眼 我从来没有想过这个!:D 谢谢! - P Ramesh
1实际上,当执行ps aux命令时,grep已经在运行。ps aux命令执行时,它的输出会作为输入发送给正在运行的grep实例。如果shell还没有执行grep命令,那么它就不会出现在ps的输出中。 - Eliah Kagan

永远不要同时使用psgrep

相反,使用killall netbeanspkill netbeans来终止它。对于进程ID,请使用pgrep netbeans

更多关于ps和grep的信息。


9这是我听过的最无用的建议。只要人们知道在 ps 的输出中 grep 进程的样子(以 "grep" 开头),那么两者一起使用绝对没有任何危险。我确实理解不在脚本中使用 kill 的建议,但那并非重点所在。 - ovangle
3我认为pgrep更糟糕,因为它只是在引诱你去执行类似'kill $(pgrep vi*)'这样极其不安全的操作。 - ovangle
1这也是本页面上最无用的答案,因为pgreppkill等只匹配进程名称 - 任何被解释的内容(如java、python、bash等)只能通过使用ps来区分与其他相同进程名称的内容。 - Izkata
3@Izkata - 使用-f选项对pgrep和pkill命令进行匹配时,将会针对整个命令行进行匹配。这在尝试匹配在解释器下运行的内容时有时很有用,正如你所提到的。但同时也是一种自掘坟墓的好方法,因为它会毫不犹豫地杀死任何在其命令行中引用了你的模式的东西 :) - roadmr