使用ps aux的进程ID


9

我是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.

NetBeans UI将消失。如果我尝试使用第一个命令获取pid,我仍然会得到:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

如果该进程已被终止,为什么仍显示上述输出?


1
它不是在显示netbeans进程,而是在通过ps aux传递grep进程!既然是这样grep netbeans,那就是您在行尾(grep --color=auto netbeans)看到的程序
David Puglielli

Answers:


15

grep正在自我完善。尝试类似的方法:

ps aux |grep [n]etbeans

这使grep无法在输出中显示自己


2
这行得通,但不是很好。您也可以这样做ps aux | grep netbeans | grep -v grep。但是请改用pgrep。
马丁·乌丁2011年

1
@queueoverflow pgrep会很好,但是它仅与进程名称匹配。第一个模式可以匹配的任何列ps。(例如,在python或java下运行的某事,pgrep不会grepping正确的东西。与pkill等等相同。)
Izkata

5

切勿使用ps一起grep

相反,利用killall netbeanspkill netbeans将其杀死。为进程ID pgrep netbeans

有关ps和grep的更多信息。


5
这是我听过的最无用的建议。只要人们知道ps输出中的grep过程是什么样子(以“ grep”开头),那么将两者一起使用绝对没有危险。我确实了解有关在脚本中不使用kill的建议,但是这很重要。
ovangle 2011年

3
而且我认为pgrep更糟,因为它只是在乞求您“杀死$(pgrep vi *)”或类似的不安全行为。
ovangle 2011年

1
这也是此页面上最无用的答案,例如pgreppkill等等,仅与进程名称匹配-只能通过使用来区分正被解释的任何内容(java,python,bash等)ps
2011年

3
@Izkata-将-f用于pgrep和pkill将与整个命令行匹配。正如您提到的,当尝试匹配在解释器下运行的内容时,它有时很有用。这也是射击自己的好方法,因为它会愉快地杀死任何在命令行中任何引用您的模式的内容:)
roadmr 2011年

4

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


@ ovangle- 眨眼,我从未想过!:D谢谢!
P Ramesh

1
事实上,grep已经运行ps aux运行。由于ps aux运行时,它的输出发送到正在运行的grep实例作为输入。如果尚未执行该Shell grep,它将不会出现在的输出中ps
Eliah Kagan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.