ps 能否在 Linux 上只显示非内核进程?

Tot*_*tor 49 linux process ps filter linux-kernel

如何要求ps只显示用户进程而不显示内核线程?

看到这个问题,明白我的意思......

Hau*_*ing 46

这应该做(在 Linux 下):

ps --ppid 2 -p 2 --deselect
Run Code Online (Sandbox Code Playgroud)

kthreadd(PID 2)具有 PPID 0(在 Linux 2.6+ 上)但ps不允许过滤 PPID 0;因此这个变通方法。

  • 像 "ps -ef" 那样做 "ps --ppid 2 -p 2 --deselect -f" 并像 "ps aux" 那样做 "ps --ppid 2 -p 2 --deselect u" (3认同)
  • 至少在 x86 arch 上的 Linux 2.4 中,这些进程的 ppid 为 1,因此无法以这种方式区分。 (2认同)

小智 13

在实践中,我发现以下习语就足够了:

ps auxf | grep -v ]$
Run Code Online (Sandbox Code Playgroud)

它过滤以括号结尾的行,这可能会导致省略不需要的条目,但可能性很小。作为交换,它很容易记住并且输入相对较快。

一些像 avahi-daemon 这样的进程会在它们的进程名信息中添加括号(avahi-daemon 的情况下是主机名),并且会被这个命令过滤掉。


Gil*_*il' 12

识别内核进程的一种方法是它们不使用任何用户内存,因此 vsz 字段为 0。这也可以捕获僵尸(感谢Stephane Chazelas的这一观察),可以根据它们的状态消除它们。

ps axl | awk '$7 != 0 && $10 !~ "Z"'
Run Code Online (Sandbox Code Playgroud)

仅列出 PID:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 8

这些进程的特殊性之一是它们不受可执行文件的支持,因此您可以执行以下操作(在 zsh 中):

ps /proc/[0-9]*/exe(^-@:h:t)
Run Code Online (Sandbox Code Playgroud)

或者使用任何 POSIX shell:

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"
Run Code Online (Sandbox Code Playgroud)

这是检查其/proc/<pid>/exe链接到文件的进程。

但这意味着您需要成为超级用户才能检查/proc/<pid>/exe符号链接的状态。

编辑:碰巧僵尸进程(至少)满足相同的条件,因此如果您不想将它们排除在外,则必须将它们添加回来。喜欢:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"
Run Code Online (Sandbox Code Playgroud)

请注意,ps -f在方括号中显示这些进程名称不是因为它们是内核进程,而是因为它们有一个空argv[](所以 ps 显示进程名称而不是argv[0]那里)。您也可以拥有一个空的用户空间进程,argv[]并且您可以拥有一个带有argv[0]that 形式的进程名称,[some-string]因此ps基于这些方括号过滤输出并不是一个万无一失的选项。