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