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;因此这个变通方法。
小智 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)
这些进程的特殊性之一是它们不受可执行文件的支持,因此您可以执行以下操作(在 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
基于这些方括号过滤输出并不是一个万无一失的选项。