我想编写一个打印当前焦点窗口名称的程序,如果它是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似乎不支持它。
答案 0 :(得分:0)
获取gnome终端PID,并检查哪个进程将此号码作为PPID。
我前几天有answered a very similar question,有关详细信息,请参阅此链接。
答案 1 :(得分:0)
谢谢亚当!我快到了。使用xprop,我可以得到gnome-terminal的PID(6736)。但不幸的是,所有gnome-terminal窗口和标签只有一个进程。通过两个打开的gnome-terminal窗口查看此pstree输出:
-gnome-terminal(6736)-+-bash(6738)---vim(6780)
| |-bash(7026)---pstree(7045)
| | `-{gnome-terminal}(6740)
有没有办法找出当前打开的gnome-terminal选项卡的bash pid?
答案 2 :(得分:0)
我需要解决同样的问题,经过一番调查我发现 wmctrl 和 pstree 以相同的顺序打印进程。
免责声明:我不确定情况是否总是如此,但在我使用此方法打开“备忘单”进行手动审查的情况下,会立即检测到问题,因此没有问题。< /p>
这是一个演示脚本,运行时将输出与当前活动终端窗口对应的 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)
然后选择想要的孩子。