为什么 ps 输出会显示某个进程,即使它没有运行?

为什么 ps 输出会显示某个进程,即使它没有运行?

为什么ps即使没有运行也会显示进程。当 Firefox 运行时:

$ echo $(ps aux | awk  '/firefox/{print $2}')
5964 6041

但是当 Firefox 没有运行时,我尝试运行相同的命令。每次都显示不同的 PID。

我尝试查找它:

$ ps aux | grep firefox
greenpa+  6056  0.0  0.0  15956   948 pts/11   S+   09:29   0:00 grep --color=auto firefox

这是什么意思?

答案1

这就是为什么你不应该或者以其他方式解析匹配命令grep的输出,而是使用pspgrep像和这样的工具pidof

当您运行 时ps | grep foogrep foo进程也会被列出ps- 因此grep foo会与任何其他foo进程一起匹配自身。当您执行 时,会发生完全相同的事情echo $(ps aux | awk '/firefox/...)-awk命令会匹配自身。

实际上,根据您想要从 获得的输出ps,最好将pgrep的输出与 结合使用ps。例如,我的系统中所有 Google Chrome 进程的状态:

ps -p $(pgrep -d, chrome) -o pid,state

pgrep在这方面的灵活性非常有用-请注意我如何使用指定输出分隔符-d,然后将其用作PID列表参数pspgrep并且pkill还能够从PID文件中读取。

答案2

正如 muru 已经指出的那样,grep 会在 ps 中留下自己的痕迹,但是,有一个将 grep 与 ps 一起使用的小解决方法:在第一个字母上使用双引号和括号,如下所示 ps aux | grep "[f]irefox"(来源:https://unix.stackexchange.com/a/74186/85039)。

相关内容