使用 ps aux 的进程 ID

P R*_*esh 10 command-line

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

ps aux|grep netbeans
Run Code Online (Sandbox Code Playgroud)

我得到输出

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 
Run Code Online (Sandbox Code Playgroud)

其中 18775 指定进程的 PID 等。

然后我用杀了它

kill 18775.
Run Code Online (Sandbox Code Playgroud)

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

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans
Run Code Online (Sandbox Code Playgroud)

如果进程已经被杀死,为什么它仍然显示上述输出?

roa*_*dmr 17

grep 正在 grep 本身。尝试类似:

ps aux |grep [n]etbeans
Run Code Online (Sandbox Code Playgroud)

这可以防止 grep 在输出中显示自己

  • 这有效,但不是很好。你也可以做`ps aux | grep 网豆 | grep -v grep`。但请改用 pgrep。 (2认同)

Mar*_*ing 5

切勿ps与 一起使用grep

相反,使用killall netbeans,pkill netbeans来杀死它。为进程ID pgrep netbeans

有关ps 和 grep的更多信息。

  • 这是我听过的最无用的建议。只要人们知道 grep 过程在 ps 的输出中是什么样子(以“grep”开头),那么将两者一起使用就绝对没有危险。我确实理解关于不在脚本中使用终止的建议,但这不是重点。 (11认同)
  • 我认为 pgrep 更糟糕,因为它只是乞求你“杀死 $(pgrep vi*)”或类似的非常不安全的东西。 (3认同)
  • @Izkata - 使用 -f 表示 pgrep 和 pkill 将匹配整个命令行。正如您提到的,当尝试匹配在解释器下运行的内容时,它有时很有用。这也是搬起石头砸自己脚的好方法,因为它会很乐意杀死任何在命令行中任何地方引用你的模式的东西:) (3认同)