Como obter o PID do shell rodando em uma janela de terminal sob o mouse?

4

Apesar de perguntas semelhantes feitas anteriormente neste fórum aqui , aqui e aqui , minha pergunta é diferente. Eu quero obter o PID de um processo bash em execução no terminal do gnome.

Observação: o link sugerido publicado pelos moderadores não fornece nenhuma solução em funcionamento. Eu não entendo as pessoas ignorantemente votar por fechar meu tópico.

Comandos como

 xprop | awk '/PID/ {print $3}' | xargs ps h -o pid,cmd
 xprop _NET_WM_PID | cut -d' ' -f3

me dê apenas o PID pai gnome-terminal não ID do processo bash

Se eu correr

 PID=$$; echo $PID

ou

 cut -d ' ' -f 4 /proc/self/stat

me dá o PID exato do terminal, mas eu tenho que executar esses comandos no terminal para obter o PID.

Eu tenho um script que alterna o processo de um terminal entre kill -STOP PID e kill -CONT PID com uma combinação de teclas de atalho.

    #!/bin/bash
    myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')
    if [[ $myid == "Sl" ]]
    then
    kill -STOP 'xdotool getwindowfocus getwindowpid'
    else
    kill -CONT 'xdotool getwindowfocus getwindowpid'
    fi

Como mencionei a linha myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')

retorna apenas o PID do pai gnome-terminal

Existe uma maneira de conseguir o que eu quero?        '

EDIT: Ao lado da resposta de Dmitry Alexandrov, eu também encontrei outra solução de trabalho aqui Como conhecer o pid da janela ativa

EDIT2: Eu falei cedo demais. Eu não sei porque, mas acima da solução não está funcionando de forma confiável. Então, eu estou usando a solução de Dmitry Alexandrov, funciona bem, exceto uma falha no meu script.

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ $myid == "Sl" ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi
Note: Process STAT is not reliable, it doesn't always toggle between Sl and T, it sometimes takes different states such as 'Ss+' 'S<' 

EDIT3:

Este funciona bem

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ *$myid* == *"S"* ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi
    
por kenn 31.08.2014 / 21:35

1 resposta

2

Se o terminal tiver apenas um processo de shell, não consigo ver um problema.

read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"

Obras para o XTerm, também devem funcionar no Terminal GNOME, acredito.

Caso contrário - se houver mais de um shell executando em um único processo de terminal (em várias janelas, guias, regiões, via multiplexador, etc.), não fica claro a partir da pergunta o que você deseja.

    
por Dmitry Alexandrov 01.09.2014 / 01:27