我正在编写一个脚本,可以运行该脚本来清理各种 Linux 发行版,以根据个人不同的使用情况删除不必要的预打包软件。但是,有很多进程(特别是在图形环境中)可能正在执行一些重要或预期的角色,而这些角色仅通过查看顶部或已安装的软件包列表是无法发现的。我可以通过简单的反复试验来诊断其中一些程序,删除程序并查看哪些程序中断,但这很耗时,而且结果并不总是准确的。有时这些程序也嵌套在其他程序运行的进程中,例如,当您在 Firefox 中下载文件时,文件管理器会弹出,以便您决定要将其保存在何处。
我想知道是否有一个程序可以识别哪个应用程序拥有屏幕上聚焦的窗口?回到 Firefox 示例,当我去下载文件并弹出文件管理器时,我想知道哪个应用程序给了我文件管理器,而不仅仅是想知道整个过程由 Firefox 拥有。理想情况下,只需将鼠标悬停在图形环境的各个元素上,就可以知道哪个应用程序拥有它们。例如,如果我将鼠标悬停在面板上的 wifi 小程序上,让我选择一个网络,我如何识别这个程序是“nm-applet”,而不仅仅是实际执行我正在运行的过程的主要网络管理器程序?
正如我所说,我尝试过逆向工程来识别什么是什么,但效率不高。如果有人知道可以尝试的方法或可以为我做到这一点的程序,那将是一个很大的帮助。
答案1
此方法来自文章 查找窗口所属的进程:
可以使用 xprop 命令行工具(Debian 包 x11-utils 的一部分)来发现某个窗口属于哪个进程。
在 shell 中执行以下命令:
xprop _NET_WM_PID | sed 's/_NET_WM_PID(CARDINAL) = //'
单击要识别其进程的窗口。(如果所需窗口不可见,请使用 Alt+Tab 将其置于前台。)然后上述命令应输出进程 ID,例如:
923
要输出父进程ID(PPID)、进程ID(PID)以及执行进程的完整命令,可以使用以下命令(方法相同):
ps ww -o ppid=,pid=,cmd= -q `xprop _NET_WM_PID | sed 's/_NET_WM_PID(CARDINAL) = //'`
示例输出:
854 2101 /usr/lib/firefox/firefox https://www.froglogic.com
答案2
如果它是 X11 窗口,运行xprop
并查找该_NET_WM_PID
属性。
(大多数客户端都设置了它,但不是全部。如果某个应用程序没有设置,请运行forkstat
,然后xkill
运行窗口并根据 forkstat 查看哪个进程刚刚死亡。)