GNU/Linux >> Tutoriales Linux >  >> Linux

¿Existe un comando de Linux para determinar las ID de ventana asociadas con una ID de proceso determinada?

xwininfo y xprop permiten recuperar lo que desea, pero es un poco complicado.

xwininfo permite recuperar todas las ventanas conocidas y xprop para consultar X sobre una ID de ventana única para su parámetro _NET_WM_PID.

Hasta ahora, una forma ingeniosa de hacerlo sería:

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

Resultado:

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

Como verá, un solo proceso puede tener una cierta cantidad de ventanas conocidas, incluso si solo ve una en su pantalla.

Tal vez debería obtener estas fuentes de herramientas para hacer lo que desea.


puede buscar PID con wmctrl también, de hecho, y creo que esa es una mejor manera de hacerlo. xwininfo devolverá todo tipo de entidades que parecen ser ventanas, pero en realidad no las encontrará en su escritorio.

Si lo hace man wmctrl , encontrará que wmctrl -l enumera todas las ventanas que son realmente visibles en su escritorio con (lo más importante) sus identificadores de ventana y títulos . -p agrega PID y -x agregará clases de ventana .

Como dice el manual (RTFM, ¿verdad? :D), wmctrl también puede buscar a través de algunos de estos y activar una ventana que coincida con la búsqueda. Sin embargo, no tengo idea de qué determina cuál de todas las coincidencias posibles se devolverá. Por otro lado, puede usar la función de listado provista para escribir un contenedor que realice mejor la búsqueda y posiblemente se base en algunas otras propiedades (como la marca de tiempo del último acceso a la ventana) que puede obtener consultando el ganar identificación a xprop, por ejemplo.

Estas líneas de código a continuación devuelven la instancia más reciente de una ventana de clase de terminal de pareja:

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

De todos modos, por lo que describe que está construyendo, si yo fuera usted, averiguaría qué clase de ventanas genera su comando deseado y luego basaría mi búsqueda en eso, en lugar de en los PID. Alternativamente, podría suponer que el comando CMD posiblemente generará ventanas con un nombre de clase que incluya CMD.

Una vez que haya encontrado su línea, debe usar la id de ventana
para activar la ventana a través de wmctrl.

Espero que esto ayude.

Una nota al margen:descubrí que xdotool también puede realizar búsquedas basadas en nombres de clases y títulos de ventanas, pero es extremadamente lento . En mi computadora, este script bash (que llama a bastantes utilidades externas) es 10 veces más rápido que la alternativa compilada que es xdotool :P.


Puedes usar:

xdotool getwindowfocus getwindowname

(Como está:no es necesario que reemplaces esos nombres que suenan bien con nada).


Linux
  1. Programación de tareas con el comando cron de Linux

  2. Diagnosticar problemas de conectividad con el comando ping de Linux

  3. Verifique el estado del archivo en Linux con el comando stat

  4. Programar una tarea con Linux al mando

  5. Primeros pasos con el comando tac de Linux

Primeros pasos con el administrador de ventanas i3 en Linux

Comando Killall en Linux con ejemplos

Comando de espera en Linux explicado con ejemplos

Cómo cambiar la prioridad de un proceso en Linux

Cómo encontrar archivos con el comando fd en Linux

¿Existe un comando en Linux para saber el número de procesador en el que se carga un proceso?