从终端列出图形进程

从终端列出图形进程

不要将这里的问题与如何以图形方式列出进程混淆,这不是我要问的。

在终端中,我如何查看哪些进程有 GUI?就像 firefox、vlc、geany、nautilus 等一样......都有一个 GUI。我想了解有关哪些进程正在使用窗口管理器资源的更多信息,并且我想从终端执行此操作。

我如何获得有关这些类型流程的更多信息?

我一直在尝试使用该ps命令,但我会接受任何终端命令来帮助我解决这个问题。

更新:我看到了我喜欢的东西,其中pstree 是我感兴趣的所有图形过程从中产生的树:

$pstree
初始化─┬─
     ├─lightdm─┬─Xorg
     │ ├─lightdm─┬─init─┬─
     │ │ │ ├─firefox───55*[{firefox}]
     │ │ │ ├─geany─┬─bash
     │ │ │ │       
     │ │ │ ├─gnome-terminal─┬─bash───pstree


答案1

尝试xrestopxrestop -b

它的目的是测量每个 X 窗口消耗了多少 X 资源,但作为一个小好处,它可以识别窗口的名称和相应的 PID。

答案2

xlsclients很接近(并且是 X 的标准部分),它列出了 X 服务器的客户端。,您认为的“应用程序”和 X 认为的“客户端”之间可能不存在 1:1 的映射。例如,我的 LyX 的单个运行实例消耗 13 个客户端,如果我使用xlsclients -l(长格式输出),我可以看到其中只有一个具有已定义的“图标名称”,但这只是一个提示。另外,由于它使用XQueryTree()它可能会错过一些窗口(它找不到xpdf我打开的任何窗口)。

它也没有提供太多信息,您可以做的是使用xlsclients -l获取窗口 id,并使用 查询每个窗口xprop -id $ID。有关窗口的更多详细信息,请使用xwinifo,尽管它关心与客户端或应用程序不同的“窗口”:

xwininfo -root -children
xwininfo -root -tree  # indented view

根据您的窗口管理器,您也许能够检查某些窗口属性(例如_NET_xxx_NET_WM_xxxx 特性)来确定某物是否是“应用程序”。如果窗口管理器客户端或 GUI 库设置了它(任何当代的都应该)_NET_WM_PID属性是最简单的(虽然不完美) 将 PID 与特定窗口关联的方法。我不知道有什么工具可以将所有这些部分联系在一起。

我使用窗口管理器 FVWM,我可以使用 直接与它对话FvwmCommand,例如FvwmCommand -i1 send_windowlist显示窗口列表。 @Arkadiusz' 使用建议wmctrl似乎是一种很好的且与窗口管理器无关的方法来完成同样的事情。

还有一个技巧是查询根窗口的_WIN_CLIENT_LIST, 通过bash

$ xwininfo -root 
xwininfo: Window id: 0x69 (the root window) (has no name)
[..]

$ IFS=",= " read -a win < <(xprop -notype -id 0x69 32x  _WIN_CLIENT_LIST )

$ for ((ww=1; ww<${#win[*]}; ww++)); do 
    printf "%i %s\n" $ww ${win[$ww]};  
    xprop -id ${win[ww]} -notype _NET_WM_PID WM_NAME WM_CLASS \
                                 WM_ICON_NAME WM_CLIENT_LEADER; 
  done

这与我的 WM 列出的窗口完全匹配(没有我配置为从 WM 窗口列表中排除的窗口)。子窗口设置WM_CLIENT_LEADER为其父窗口(例如会话管理),尽管父窗口可能不可见(firefox 会这样做),并且可能指向其自身。

xrestop不过得到我的投票。

答案3

或者,如果您正在使用欧洲WMH兼容的窗口管理器你可以wmctrl尝试一下。它可以列出所有windows being managed by the window manager+它们的 PID:

$ wmctrl  -lp | awk  '{ print $3 }' | sort | uniq
15672
19685
19925
26247
6884

答案4

是的,你需要 X。但我不知道有什么工具可以开箱即用地执行此操作。

具有 GUI 的应用程序是本地 X 服务器上的客户端。但是,本地 X 服务器上的客户端不一定是具有 GUI 的应用程序。此外,本地 X 服务器上的客户端不一定是本地进程,具有 GUI 的本地进程很可能是远程 X 服务器上的客户端。

我想你会接近xlsclientsor xlsclients -a。通过该-l选项,它还会为您提供(除其他外)窗口 ID。但它不能给你PID。一般来说,X 并不知道这一点。

思考:使用 root 访问权限,您可以通过 greplsof输出来查看哪些(本地!)进程访问(本地!)X 服务器。那么也许已经有一些工具可以做到这一点?我不知道。

相关内容