当前位置: 首页 > 面试题库 >

是否有Linux命令来确定与给定进程ID相关联的窗口ID?

施令秋
2023-03-14
问题内容

给定XX的进程iD,我想有一个任何窗口ID的列表,其中_NET_WM_PID = XX。如果可能的话,最好的办法是最旧的仍处于活动状态的窗口ID。

我对linux还是很陌生,但是我想做的是创建一个使用命令行的脚本,并查看是否有一个窗口已经打开,该窗口属于使用同一命令行调用的进程。如果是这样,只需将焦点设置在该窗口上,否则执行命令行以进行新的处理。我的意图是在我的ubuntu桌面上使用此脚本,在这里我会将这个脚本挂接到我的笔触鼠标手势命令中,这样,例如,每次我为gmail手势时,我都不会获得全新的gmail会话,转到我现有的gmail
chrome应用程序窗口。也许有一个更简单的方法可以解决所有这些问题,但是我还没有找到解决方法。

在帮助下,我已经弄清楚了如何使用pgrep为命令行找到PID,以及如何使用wmctrl将焦点设置到窗口句柄,但是我一直坚持从PID到窗口ID。


问题答案:

xwininfo和xprop允许检索您想要的内容,但这有点棘手。

xwininfo允许检索所有已知的窗口,并且xprop可以查询_NET_WM_PID参数的有关单个窗口ID的X。

到目前为止,一种骇人听闻的方法是:

#!/bin/sh

findpid=$1

known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')

for id in ${known_windows}
do
    xp=$(xprop -id $id _NET_WM_PID)
    if test $? -eq 0; then
        pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')

        if test "x${pid}" = x${findpid}
        then
            echo "Windows Id: $id"
        fi
    fi
done

结果:

mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e

如您将看到的,即使您仅在屏幕上看到一个窗口,单个进程也可能具有一定数量的已知窗口。

也许您应该获得这些工具资源,以便做出自己想要的东西。



 类似资料:
  • 问题内容: 我需要一个独立于平台的(Linux / Unix | OSX)shell / bash命令,该命令将确定特定进程是否正在运行。例如,…最简单的方法/命令是什么? 问题答案: 尽管和是确定正在运行的工具的绝佳工具,但不幸的是,它们在某些操作系统上均不可用。确定的故障保护将使用以下内容: Gentoo Linux上的输出: OS X上的输出: 在Linux和OS X上,grep都会返回退出

  • 我在找一个算法(或者其他什么方法)来确定一个给定的加权图在O(ElogV)中是否有唯一的MST(最小生成树)? 我对体重一无所知(如体重(e1)!= weight(e2)),如果该图只有一个唯一的MST,则算法返回True,否则返回False。 我首先使用 Kruskal 的算法,并检查 find-set(u)==find-set(v) 是否因此在 MST 中有一个圆圈,但这种方式并没有涵盖我认为

  • killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。 killall 命令的基本格式如下: [root@localhost ~]# killall [选项] [信号] 进程名 注意,此命令的信号类型同 kill 命令一样,因此

  • 我想使用Java程序执行如下类似的linux命令: sudo-su(用户ID) 然后提示输入密码 (userid)的[sudo]密码: 我有一个java程序,它使用我的有效凭据连接到linux服务器,并且能够执行/返回基本的linux命令,例如“ls-ltd r, pwd...”。但是,我被卡住了,并且面临着执行sudo命令的问题,如上所述。 请建议我需要向程序中添加什么代码来使用给定的用户ID执

  • 问题内容: 是否有Linux库可以使我知道哪些进程拥有哪些IP套接字?我想我正在寻找的程序化等效项。最终,我想将透视的数据包与进程关联起来。 更新: 有人建议使用和,但是在我的系统上,每个进程都显示相同的数据,因此无济于事。 问题答案: 我认为您首先必须浏览/ proc / * / fd中打开的fds,例如 然后在/ proc / net / tcp(或/ proc / net / udp)中查找

  • 运用命令窗口去调入变量,运行函数和M-文件。如要得到更多的关于控制输出与输入的信息,请看控制命令窗口输入与输出。 命令历史 在控制窗的输入内容都被记录在 命令历史窗口中。在命令历史中,你可以看到以前用过的函数,并且可以复制和执行选定行。 要从MATLAB任务到一个文件保存输入与输出的内容,可以用diary函数。 运行外部程序 你可以在MATLAB控制窗口中运行外部程序。感叹号!为起点就可以跳出当前