GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il une commande Linux pour déterminer les ID de fenêtre associés à un ID de processus donné ?

xwininfo et xprop permettent de récupérer ce que l'on veut, mais c'est un peu délicat.

xwininfo permet de récupérer toutes les fenêtres connues, et xprop d'interroger X sur un identifiant de fenêtre unique pour votre paramètre _NET_WM_PID.

Jusqu'à présent, une façon hacky de le faire serait :

#!/bin/sh

findpid=$1

known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')

for id in ${known_windows}
do
    xp=$(xprop -id $id _NET_WM_PID)
    if test $? -eq 0; then
        pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')

        if test "x${pid}" = x${findpid}
        then
            echo "Windows Id: $id"
        fi
    fi
done

Résultat :

mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e

Comme vous le verrez, un même processus peut avoir un certain nombre de fenêtres connues, même si vous n'en voyez qu'une sur votre écran.

Peut-être devriez-vous obtenir ces sources d'outils afin de faire ce que vous voulez.


vous pouvez rechercher des PID avec wmctrl aussi, en fait, et je pense que c'est une meilleure façon de le faire. xwininfo renverra toutes sortes d'entités qui semblent être des fenêtres, mais vous ne les trouverez pas vraiment sur votre bureau.

Si vous faites man wmctrl , vous constaterez que wmctrl -l répertorie toutes les fenêtres qui sont réellement visibles sur votre bureau avec (surtout) leurs identifiants de fenêtre et titres . -p ajoute des PID et -x ajoutera des classes de fenêtres .

Comme le dit le manuel (RTFM, n'est-ce pas ? :D), wmctrl peut également rechercher dans certains d'entre eux et activer une fenêtre correspondant à la recherche. Cependant, je n'ai aucune idée de ce qui détermine laquelle de toutes les correspondances possibles sera renvoyée. D'un autre côté, vous pouvez utiliser la fonction de liste fournie pour écrire un wrapper qui effectue mieux la recherche et éventuellement basé sur d'autres propriétés (telles que l'horodatage du dernier accès à la fenêtre) que vous pouvez obtenir en interrogeant le gagner un identifiant à xprop, par exemple.

Ces lignes de code ci-dessous renvoient l'instance la plus récente d'une fenêtre de classe mate-terminal :

XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm    #save tmp files to memory to make it faster
LST=`mktemp`              #tmp file to store our listing 
wmctrl -lx |  awk -F' ' '{printf("%s\t%s    \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n")  }'  > $LST #pretty-print our listing of windows into the tmp file
 #To each line of listing, prepend a timestamp acquired via an xprop call
 #Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`;  TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST  #delete tmp file

Quoi qu'il en soit, pour la chose que vous décrivez que vous construisez, si j'étais vous, je trouverais quelle classe de fenêtres votre commande souhaitée génère, puis je baserais ma recherche sur cela, plutôt que sur les PID. Alternativement, vous pouvez supposer que la commande CMD générera éventuellement des fenêtres avec un nom de classe qui inclut CMD.

Après avoir trouvé votre ligne, vous devez utiliser l'identifiant de fenêtre
pour activer la fenêtre via wmctrl.

J'espère que cela vous aidera.

Remarque :j'ai découvert que xdotool peut également effectuer des recherches basées sur les noms de classe et les titres de fenêtre, mais il est extrêmement lent . Sur mon ordinateur, ce script bash (qui appelle pas mal d'utilitaires externes) est 10 fois plus rapide que l'alternative compilée qu'est xdotool :P.


Vous pouvez utiliser :

xdotool getwindowfocus getwindowname

(En l'état :vous n'avez pas besoin de remplacer ces noms qui sonnent bien par quoi que ce soit.)


Linux
  1. Planification des tâches avec la commande Linux cron

  2. Vérifiez l'état du fichier sous Linux avec la commande stat

  3. Planifier une tâche avec la commande Linux at

  4. Trouver le temps d'exécution d'une commande ou d'un processus sous Linux

  5. Pourquoi exécuter une commande shell Linux avec '&' ?

Premiers pas avec le gestionnaire de fenêtres i3 sous Linux

Commande Killall sous Linux avec des exemples

La commande Wait sous Linux expliquée avec des exemples

Comment changer la priorité d'un processus sous Linux

Comment rechercher des fichiers avec la commande fd sous Linux

Existe-t-il une commande sous Linux pour connaître le numéro de processeur dans lequel un processus est chargé ?