3

我想编写一个程序,它打印当前聚焦的窗口名称,如果它是一个 gnome-terminal,然后打印出当前 gnome-terminal 选项卡内正在运行的程序(例如 vim,如果 vim 会话正在运行)。

为了获得当前聚焦的窗口名称,我使用了:

xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"

xprop -id 0x220ad5a | grep "WM_CLASS(STRING)"

如果当前窗口是 gnome-terminal,这将返回 'gnome-terminal'。

但是我怎样才能找到在 gnome-terminal 中运行的程序(更准确地说:在当前的 gnome-terminal 选项卡中)?我考虑过使用 dbus,但 gnome-terminal 似乎不支持它。

4

3 回答 3

1

我需要解决同样的问题,经过一番调查,我发现 wmctrl 和 pstree 以相同的顺序打印进程。

免责声明:我不确定情况是否总是如此,但在我使用这种方法打开“备忘单”进行手动审查的情况下,会立即检测到它的问题,因此没有问题。

这是一个演示脚本,运行时将输出与当前活动终端窗口相对应的 pstree 的正确行。为了调试,它将中间步骤打印到 ~/debug.txt

#!/bin/bash
winid=$(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW)/ {print $NF}' | xargs printf "%#010x\n")
echo 'winid:'$winid >> ~/debug.txt
winclass=$(xprop -id $winid | awk '/WM_CLASS/ {print $NF}')
niceclass=${winclass//\"/}
echo 'winclass:'$niceclass >> ~/debug.txt
if [ $niceclass == "Gnome-terminal" ]
then
    terminalPID=$(xprop -id $winid | awk '/_NET_WM_PID/ {print $NF}')
    echo 'winPID:'$terminalPID >> ~/debug.txt
     # get inx of window for this PID
    termInx=$(wmctrl -l -p | grep $terminalPID | awk '/'"$winid"'/ {print NR}')
    echo 'term inx:'$termInx >> ~/debug.txt
     # Take the childprocess of that inx and PID
    shell_process=$(pstree -p $terminalPID | sed "s/.*(1998)//" | sed "s/\W*//" | awk  'NR=='$termInx)
    pstree -p $terminalPID >> ~/debug.txt
    echo 'found process:'$shell_process >> ~/debug.txt
    echo 'found process:'$shell_process
fi

预期输出:

tony@tony-mini:~$ ./test_so.sh 
found process:bash(8001)---test_so.sh(9869)---test_so.sh(9885)-+-awk(9889)

然后挑选出想要的孩子。

于 2021-08-04T07:02:36.177 回答
0

获取 gnome 终端 PID,并检查哪些进程将此编号作为 PPID。

几天前我已经回答了一个非常相似的问题,请参阅此链接了解详细信息。

于 2010-01-24T12:12:13.737 回答
0

谢谢亚当!我快到了。使用 xprop 我可以获得 gnome-terminal (6736) 的 PID。但不幸的是,所有 gnome 终端窗口和选项卡只有一个进程。使用两个打开的 gnome-terminal 窗口查看此 pstree 输出:

 -gnome-terminal(6736)-+-bash(6738)---vim(6780) 

  |                    |-bash(7026)---pstree(7045) 

  |                    | `-{gnome-terminal}(6740) 

有没有办法找出当前打开的 gnome-terminal 选项卡的 bash pid?

于 2010-01-24T13:08:16.143 回答