GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es einen Linux-Befehl, um die Fenster-IDs zu bestimmen, die einer bestimmten Prozess-ID zugeordnet sind?

xwininfo und xprop erlauben es, abzurufen, was Sie wollen, aber es ist ein wenig knifflig.

xwininfo erlaubt es, alle bekannten Fenster abzurufen, und xprop, X nach einer einzelnen Fenster-ID für Ihren _NET_WM_PID-Parameter abzufragen.

Bisher wäre ein hackiger Weg, es zu tun:

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

Ergebnis:

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

Wie Sie sehen werden, kann ein einzelner Prozess eine bestimmte Anzahl bekannter Fenster haben, selbst wenn Sie nur eines auf Ihrem Bildschirm sehen.

Vielleicht sollten Sie sich diese Werkzeugquellen besorgen, um zu machen, was Sie wollen.


Sie können PIDs mit wmctrl nachschlagen eigentlich auch, und ich denke, das ist ein besserer Weg, es zu tun. xwininfo gibt alle Arten von Objekten zurück, die wie Fenster aussehen, aber Sie werden sie nicht wirklich auf Ihrem Desktop finden.

Wenn Sie man wmctrl tun , finden Sie das wmctrl -l listet alle Fenster auf, die tatsächlich auf Ihrem Desktop sichtbar sind, mit (am wichtigsten) ihren Fenster-IDs und Titel . -p fügt PIDs hinzu und -x fügt Fensterklassen hinzu .

Wie das Handbuch sagt (RTFM, richtig? :D), kann wmctrl auch einige davon durchsuchen und ein Fenster aktivieren, das der Suche entspricht. Ich habe jedoch keine Ahnung, was bestimmt, welche aller möglichen Übereinstimmungen zurückgegeben werden. Andererseits können Sie die bereitgestellte Auflistungsfunktion verwenden, um einen Wrapper zu schreiben, der die Suche besser macht und möglicherweise auf einigen anderen Eigenschaften basiert (z. B. dem Zeitstempel des letzten Zugriffs auf das Fenster), die Sie durch Abfragen der bereitgestellten Gewinn-ID zu xprop, zum Beispiel.

Die folgenden Codezeilen geben die neueste Instanz eines Mate-Terminal-Klassenfensters zurück:

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

Wie auch immer, für das, was Sie beschreiben, was Sie bauen – wenn ich Sie wäre, würde ich herausfinden, welche Klasse von Fenstern Ihr gewünschter Befehl generiert, und meine Suche dann darauf basieren, anstatt auf PIDs. Alternativ könnten Sie davon ausgehen, dass der Befehl CMD möglicherweise Fenster mit einem Klassennamen generiert, der CMD enthält.

Nachdem Sie Ihre Zeile gefunden haben, sollten Sie die Fenster-ID verwenden
um das Fenster per wmctrl zu aktivieren.

Hoffe das hilft.

Eine Randbemerkung:Ich habe festgestellt, dass xdotool auch auf der Grundlage von Klassennamen und Fenstertiteln suchen kann, aber es ist extrem langsam . Auf meinem Computer ist dieses Bash-Skript (das eine ganze Reihe externer Dienstprogramme aufruft) zehnmal so schnell wie die kompilierte Alternative xdotool :P.


Sie können Folgendes verwenden:

xdotool getwindowfocus getwindowname

(Auch:Sie müssen diese gut klingenden Namen nicht durch irgendetwas ersetzen.)


Linux
  1. Planen von Aufgaben mit dem Linux-Cron-Befehl

  2. Diagnostizieren Sie Verbindungsprobleme mit dem Linux-Ping-Befehl

  3. Überwachen Sie Befehle und Aufgaben mit dem Linux-Überwachungsbefehl

  4. Überprüfen Sie den Dateistatus unter Linux mit dem Befehl stat

  5. Planen Sie eine Aufgabe mit dem Linux-Befehl at

Erste Schritte mit dem i3 Window Manager unter Linux

Killall-Befehl in Linux mit Beispielen

Wait-Befehl in Linux anhand von Beispielen erklärt

So ändern Sie die Priorität eines Prozesses in Linux

So finden Sie Dateien mit dem fd-Befehl in Linux

Gibt es in Linux einen Befehl, um die Prozessornummer zu ermitteln, in der ein Prozess geladen wird?