为什么ps即使没有运行,也会显示一个进程。当 Firefox 运行时:
$ echo $(ps aux | awk '/firefox/{print $2}')
5964 6041
Run Code Online (Sandbox Code Playgroud)
但是当 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
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
这就是为什么您不应该或以其他方式解析匹配命令grep的输出,而是使用和 等工具。pspgreppidof
当您运行时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
Run Code Online (Sandbox Code Playgroud)
pgrep在这方面的灵活性非常有用 - 请注意我如何使用 指定输出分隔符-d,然后将其用作 的 PID 列表参数ps。pgrep并且pkill还能够读取 PID 文件。