是否可以排除某些进程的报告top
?
例如,我想将其自身从列表中排除(即,我不想top
在进程列表中显示)。
我还希望能够排除不属于正在运行的用户的进程top
(除了root
)。
这可能吗?如果可以,怎么做?如果不行,有没有类似的工具可以做我想做的事情(不需要ps
频繁运行类似的东西)。
我知道你可以通过使用-u
或-U
选项来监控特定用户的进程,但这与监控不同仅有的正在运行的用户所拥有的进程top
。
答案1
Top 直接从 /proc 文件系统获取信息,该文件系统是 Linux 内核动态生成的“虚拟”文件系统。
因此,隐藏特定进程(例如其自身)只有在以下情况下才有可能:
- 你编写了一个劫持 /proc fs 的内核模块
- 你修改了顶层应用程序的源代码(用户级代码)
如果您想要完全控制可见的内容,您应该自己编写一个读取 /proc 的脚本/程序。
我建议你多探索一下 /proc。你可能只需要一个简单的 grep/cat/awk 脚本就能完成你想要的操作。
答案2
这个问题讨论得有点晚了,但有人可能会觉得它很有用。OP 只想查看当前用户的进程并top
从结果中排除。可以使用 和 来执行该命令watch
。例如:top
grep
watch -c -n 0.01 "top -b -U${USER} | grep -v -w -e top -e chrome -e libexec -e daemon -e csh"
可以轻松将要排除的其他词语添加到grep
。
也许ps
输出比更受欢迎top
,因为它可能执行得更快:
watch -c -n 0.01 "ps -aef | grep -w ${USER} | grep -v -w -e ps -e chrome -e libexec -e daemon -e csh"
不管怎样,这是一种不同的方法,既不需要修改 Linux 内核,也不需要修改top
源代码。
编辑2024-03-05:这是一个简单的脚本,它将调用ps
上面讨论的命令:
#!/bin/bash
#
# This is a simple wrapper for "watch"ing filtered "ps" output in an infinite loop. The ps table is too cluttered
# on a linux desktop -- this cleans it up according to a pre-defined FILTER.
#
FILTERED=(
"-e ps"
"-e chrome"
"-e libexec"
"-e daemon"
"-e csh"
"-e dbus"
"-e gnome"
"-e pulseaudio"
"-e thunderbird"
"-e ssh"
"-e cat"
"-e keybase"
"-e slack"
)
FILTER="grep -v -w ${FILTERED[@]}"
exec watch -c -n 0.01 "ps -aef | grep -w -e ${USER} -e PPID | ${FILTER}"
答案3
top | grep -v 在一定程度上可以实现这一点。但是随着 top 刷新,显示内容会重叠。