web-dev-qa-db-fra.com

Comment obtenir le PID de Shell s'exécutant dans une fenêtre de terminal sous la souris?

Bien que des questions similaires soient posées auparavant dans ce forum ici , ici et ici , ma question est différente. Je veux obtenir le PID d'un processus bash en cours d'exécution dans le terminal gnome.

Remarque: Le lien suggéré qui a été posté par les modérateurs ne fournit aucune solution de travail. Je ne comprends pas que les gens votent par ignorance pour clore mon sujet.

Des commandes comme

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

donnez-moi seulement gnome-terminal PID parent et ID de processus bash

Si je cours

 PID=$$; echo $PID

ou

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

me donne le PID exact du terminal mais je dois exécuter ces commandes dans le terminal pour obtenir le PID.

J'ai un script qui bascule le processus d'un terminal entre kill -STOP PID et kill -CONT PID avec une combinaison de touches de raccourci.

    #!/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

Comme je l'ai mentionné la ligne myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')

renvoie uniquement le PID du parent gnome-terminal

Y at-il un moyen de réaliser ce que je veux? `

EDIT: A côté de la réponse de Dmitry Alexandrov, j'ai également trouvé une autre solution de travail ici Comment connaître le pid de la fenêtre active

EDIT2: J'ai parlé trop tôt. Je ne sais pas pourquoi mais la solution ci-dessus ne fonctionne pas de manière fiable. Donc, j'utilise la solution de Dmitry Alexandrov, cela fonctionne bien, sauf un petit problème dans mon 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:

Celui-ci fonctionne bien

   #!/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
4
kenn

Si le terminal n'a qu'un processus Shell, je ne vois pas de problème.

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

Fonctionne pour XTerm, devrait fonctionner pour GNOME Terminal aussi, je crois.

Sinon, s’il peut y avoir plus d’un shell exécuté sous un même processus terminal (dans plusieurs fenêtres, onglets, régions, via un multiplexeur, etc.), la question ne vous dit pas vraiment ce que vous voulez.

2
Dmitry Alexandrov