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
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.