如何以编程方式获取活动 GNOME 终端实例的 PID?

ænd*_*rük 5 scripts gnome-terminal automation

如何从 Bash 脚本中获取我正在使用的 GNOME 终端实例的 PID?

我可以运行xprop _NET_WM_PID然后手动单击终端窗口,但我想完全自动化。

Ser*_*nyy 4

我编写了两个递归函数来跟踪进程的父进程

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$
Run Code Online (Sandbox Code Playgroud)

我在这个过程中发现的是这样的:

$ bash get_process_list                                                        
PPID    PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
 2164 x-terminal-emulator
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm
Run Code Online (Sandbox Code Playgroud)

因此,我们可以使用这两个函数和grepgnome-terminal假设这就是用户想要的。如果用户想要任何终端模拟器,这可能会出现问题,因为除了检查lsofpts 设备是否打开之外,无法判断该进程是否是终端模拟器。

除此之外,还有一点非常有趣:

$ bash get_process_list                                                                    
PPID    PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
 2164 tmux
 1677 init --user
 1342 lightdm --session-child 12 19
    1 lightdm
Run Code Online (Sandbox Code Playgroud)

tmux显然fork 本身并且该过程被 接管init所以又出现了障碍。

使用Unity的Ayatana

下面的代码使用qdbusAyatana 的 dbus 接口来列出所有 gnome 终端窗口以及它们当前是否处于焦点状态。稍后可以对其进行解析或编辑以仅输出活动/聚焦窗口 PID

示例运行:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false
Run Code Online (Sandbox Code Playgroud)

以及代码本身

get_parent()
{
 ps --no-headers -p $1 -o ppid,cmd 
}

process_list()
{
  if [ "$1" -ne "1"  ]; then
   PARENT="$(get_parent $1 )"
   printf "%s\n" "$PARENT"
   process_list $( printf "%s" "$PARENT" | awk '{print $1}'  )
  fi 
}

print_header()
{
  printf "PPID\tPROCESS\n"
  for i in $(seq 1 20 ) 
  do
     printf "-"
  done
  printf "\n"
}
print_header
process_list $$
Run Code Online (Sandbox Code Playgroud)