为什么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
的输出,而是使用ps
pgrep
像和这样的工具pidof
。
当您运行 时ps | grep foo
,grep 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列表参数ps
。pgrep
并且pkill
还能够从PID文件中读取。
答案2
正如 muru 已经指出的那样,grep 会在 ps 中留下自己的痕迹,但是,有一个将 grep 与 ps 一起使用的小解决方法:在第一个字母上使用双引号和括号,如下所示 ps aux | grep "[f]irefox"
(来源:https://unix.stackexchange.com/a/74186/85039)。