为什么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
的输出,而是使用像pgrep
和pidof
这样的工具 。
当你运行ps | grep foo
ps | grep foo
, grep 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列表参数。 pgrep
和pkill
也能够从PID文件中读取。
正如muru已经指出grep在ps中留下了自己的痕迹,但是,使用grep与ps有一个小的解决方法:在第一个字母上使用双引号和括号,如此ps aux | grep "[f]irefox"
ps aux | grep "[f]irefox"
(来源: https : ps aux | grep "[f]irefox"
)。