为什么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 

这是什么意思?

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

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

实际上,根据你想要的ps输出,你可能最好使用ps pgrep输出。 例如,我系统中所有Google Chrome进程的状态:

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

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

正如muru已经指出grep在ps中留下了自己的痕迹,但是,使用grep与ps有一个小的解决方法:在第一个字母上使用双引号和括号,如此ps aux | grep "[f]irefox" ps aux | grep "[f]irefox" (来源: https : ps aux | grep "[f]irefox" )。