GNU/Linux >> Znalost Linux >  >> Linux

Existuje linuxový příkaz k určení ID oken spojených s daným ID procesu?

xwininfo a xprop umožňují získat, co chcete, ale je to trochu složitější.

xwininfo umožňuje načíst všechna známá okna a xprop dotazovat X na jedno ID okna pro váš parametr _NET_WM_PID.

Zatím by to byl otřesný způsob:

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

Výsledek:

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

Jak uvidíte, jeden proces může mít určitý počet známých oken, i když na obrazovce vidíte pouze jedno.

Možná byste měli získat zdroje těchto nástrojů, abyste vytvořili to, co chcete.


PID můžete vyhledat pomocí wmctrl ve skutečnosti taky a myslím, že je to lepší způsob, jak to udělat. xwininfo vrátí všechny druhy entit, které vypadají jako okna, ale ve skutečnosti je na ploše nenajdete.

Pokud uděláte man wmctrl , zjistíte, že wmctrl -l uvádí všechna okna, která jsou skutečně viditelná na vaší ploše, s (co je nejdůležitější) jejich ID oken a názvy . -p přidá PID a -x přidá třídy oken .

Jak říká manuál (RTFM, že? :D), wmctrl může také prohledat některé z nich a aktivovat okno, které odpovídá vyhledávání. Netuším však, co určuje, která ze všech možných shod bude vrácena. Na druhou stranu můžete použít poskytnutou funkci výpisu k sepsání obálky, která dělá vyhledávání lépe a možná na základě některých dalších vlastností (jako je časové razítko posledního přístupu do okna), které můžete získat dotazem na poskytnuté ID win například xprop.

Tyto řádky kódu níže vrátí poslední instanci okna třídy mate-terminálu:

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

Každopádně pro věc, kterou popisujete, vytváříte – na vašem místě bych zjistil, jakou třídu oken generuje váš požadovaný příkaz, a pak na tom založím své hledání, spíše než na PID. Případně můžete předpokládat, že příkaz CMD možná vygeneruje okna s názvem třídy, který obsahuje CMD.

Po nalezení řádku byste měli použít ID okna
pro aktivaci okna pomocí wmctrl.

Doufám, že to pomůže.

Poznámka na okraj:Zjistil jsem, že xdotool umí vyhledávat i na základě názvů tříd a názvů oken, ale je to extrémně pomalé . Na mém počítači je tento bash skript (který volá několik externích nástrojů) 10krát rychlejší než kompilovaná alternativa, kterou je xdotool :P.


Můžete použít:

xdotool getwindowfocus getwindowname

(Jak je:nemusíte tato pěkně znějící jména ničím nahrazovat.)


Linux
  1. Plánování úloh pomocí linuxového příkazu cron

  2. Diagnostikujte problémy s připojením pomocí příkazu Linux ping

  3. Naplánujte si úlohu pomocí příkazu Linux at

  1. Sledujte příkazy a úkoly pomocí příkazu watch v systému Linux

  2. Najděte čas provedení příkazu nebo procesu v systému Linux

  3. Proč spouštět příkaz prostředí Linux s '&'?

  1. Nahraďte chytré uvozovky příkazem sed pro Linux

  2. Zkontrolujte stav souboru v systému Linux pomocí příkazu stat

  3. Začínáme s příkazem tac systému Linux