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