Como eu posso obter programaticamente o PID da instância ativa do Terminal GNOME?

5

Como posso obter o PID da instância do Terminal do GNOME que estou usando em um script Bash?

Eu posso executar xprop _NET_WM_PID e, em seguida, clicar manualmente na janela do terminal, mas gostaria de automatizar completamente isso.

    
por ændrük 20.05.2012 / 00:00

3 respostas

3

Eu escrevi duas funções recursivas que rastreiam pais de um processo

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

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

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

O que eu encontrei no processo é este:

$ 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

Portanto, podemos usar as duas funções e grep the gnome-terminal , supondo que seja o que o usuário deseja. Se o usuário quiser qualquer emulador de terminal, isso pode ser problemático porque, além de verificar lsof para um dispositivo pts aberto, não há como saber se o processo é ou não um emulador de terminal.

Além disso, há algo muito interessante também:

$ 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

tmux aparentemente garfos e o processo é pego por init , então, novamente, há o obstáculo.

Usando o Ayatana da Unity

O código abaixo usa qdbus e a interface dba do Ayatana para listar todas as janelas do gnome-terminal e se elas estão focadas no momento ou não. Isto pode ser mais tarde analisado ou editado para produzir somente PID de janela ativa / focada

Execução da amostra:

$ bash get_gt_pd.sh                                                                    
XID:33554486    PID:20163   ACTIVE:true
XID:33554444    PID:20163   ACTIVE:false

E o próprio código

get_gt_xid()
{ # Prints XID of each gnome-terminal window
 qdbus --literal org.ayatana.bamf \
      /org/ayatana/bamf/matcher \
     org.ayatana.bamf.matcher.XidsForApplication \
    /usr/share/applications/gnome-terminal.desktop
}

for window in  $(get_gt_xid | awk -F'{' '{ gsub(/\,|}|]/," ");print   }' )
do
  PID=$(qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
        org.ayatana.bamf.window.GetPid)
  ACTIVE=$( qdbus org.ayatana.bamf /org/ayatana/bamf/window/"$window"\
            org.ayatana.bamf.view.IsActive  )
  printf "XID:%s\tPID:%s\tACTIVE:%s\n" "$window" "$PID" "$ACTIVE"
done
    
por Sergiy Kolodyazhnyy 06.04.2016 / 17:35
1
  

Há momentos em que mais de uma instância está em execução - quando eu tenho um terminal aberto em uma sessão de convidado, por exemplo

A variável $PPID fornecerá o processo pai para o shell bash atual, que geralmente é gnome-terminal .

Por segurança, os seguintes itens encontrarão o processo parent gnome-terminal mesmo se vários shells bash estiverem aninhados:

pstree -p -s $PPID | grep -Po 'gnome-terminal\(\K.*?(?=\))'

A seguinte versão universal funcionará para qualquer shell, mesmo que outras instâncias do grep estejam em execução. Decifrar é deixado como um exercício para o leitor;)

pstree -p -a -s \
$(pstree -p -a | grep -B3 $RANDOM$RANDOM \
| grep -m1 'echo $SHELL |cut -d/ -f3' | cut -d, -f2)\
| grep gnome-terminal | cut -d, -f2
    
por ish 20.05.2012 / 02:15
1

Essa solução parece mais robusta para mim. Ele procura recursivamente o PID pai até encontrar um que pertença ao Terminal do GNOME.

find-parent() {
    i=($(ps -o pid= -o ppid= -o cmd= -p ))
    ((i[0] == 1)) && return 1
    if [[ ${i[2]} =~ (^|/)gnome-terminal$ ]]; then echo ${i[0]}; else find-parent ${i[1]}; fi
}; find-parent $PPID
    
por ændrük 09.06.2012 / 21:47