Cómo obtener el número de pantalla que me asignó X

20

De X (7) páginas man

DISPLAY NAMES
       From the user's perspective, every X server has a display name of the form:

                                  hostname:displaynumber.screennumber
[...]

displaynumber
    [...]
    To avoid confusion, each display on a machine is assigned a display
    number (beginning at 0) when the X server for that display is started.

¿Cómo puedo encontrar el número de pantalla que me han asignado?

¿O enumerar las pantallas abiertas actualmente y sus usuarios?

ricab
fuente

Respuestas:

29

Si conoce una ID de proceso que se ejecuta en la sesión del usuario y tiene permiso para acceder a la información de ese proceso, puede seleccionar su entorno para la DISPLAYvariable:

cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='

Como ejemplo, para enumerar todas las pantallas principales utilizadas por su UID en la computadora actual, use:

ps -u $(id -u) -o pid= | \
    while read pid; do
        cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
    done | grep -o ':[0-9]*' | sort -u

Si solo ha iniciado sesión en una sesión X, lo anterior debería generar solo una línea con algo así :0.

Amir
fuente
Nota: Si desea usar esto en una línea, debe agregar un ;antes de done.
not2qubit
@ user1147688 gracias, pero un personaje de nueva línea funciona igual de bien, al menos en los shells que uso (Bash y Dash).
Amir
Brillant! Gracias. Robé esto para unix.stackexchange.com/a/429162/12574 con algunas mejoras;)
Gilles Quenot
11

En la sesión X, siempre puede consultar la DISPLAYvariable de entorno para obtener su número de visualización actual ( echo $DISPLAY).

Descubrir los números de visualización de los demás es más difícil. No creo que haya una forma estándar de obtener la información que no sea preguntar a todos los usuarios a qué pantalla están conectados, por lo que cualquier intento de obtener esta información requiere algún tipo de piratería y no funcionará en todos los casos.

Hay algunas opciones dadas en otras partes de SE pero no funcionarán en Debian Wheezy, por ejemplo. Sin embargo, enumerar las pantallas actualmente activas es fácil, como se muestra en la publicación que he vinculado anteriormente:

ps axu | grep "X " le mostrará los procesos X que se están ejecutando actualmente, algo como lo siguiente:

root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a

El primer parámetro después /usr/bin/Xes el número de pantalla prefijado por dos puntos, y el siguiente le muestra el terminal virtual asignado a la sesión.

Sin embargo, puede obtener su respuesta al mirar la lista de procesos:

ps axu |grep -3 "X "

root      1990  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1991  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1992  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      2359  0.0  0.0   5264  2228 ?        S    Sep15   0:00 -:1            
user_1     2378  0.0  0.0   4920  1348 ?        Ss   Sep15   0:00 /bin/sh /usr/bin/startkde
user_1     2443  0.0  0.0   3868   348 ?        Ss   Sep15   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root      7500  0.0  0.0   6460  1080 ?        Ss   Sep14   0:00 /usr/sbin/sshd
ntp       7841  0.0  0.0   5352  1760 ?        Ss   Sep14   0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root      7882  0.0  0.0   3964   716 ?        Ss   Sep14   0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root      7906  0.0  0.0   5260  2224 ?        S    Sep14   0:00 -:0            
user_2    7925  0.0  0.0  12924  1560 ?        Ssl  Sep14   0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2    7990  0.0  0.0   3868   348 ?        Ss   Sep14   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde

Mire las líneas después /usr/bin/X: cuando comienza la sesión X, generalmente se inicia un administrador de ventanas como el usuario al que pertenece la sesión, y allí obtiene el nombre de usuario. En mi caso, user_1 está usando KDE y user_2 está usando LXDE. Sin embargo, esta solución se basa únicamente en el hecho de que el núcleo está asignando nuevas ID de proceso en secuencia ascendente, lo que podría no ser siempre el caso.

zagrimsan
fuente
Gracias, consultar DISPLAY es la respuesta, creo. Sin embargo, la variable DISPLAY puede estar desactualizada. Esto me sucedió al volver a conectar a una sesión de pantalla . Causó que las cosas gráficas no funcionaran. Lo resolví separando, haciendo eco en DISPLAY, volviendo a conectar y configurando DISPLAY en el nuevo valor.
ricab
Linux expone el entorno de cada proceso en /proc/$pid/environ, como en cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Vea mi respuesta para otro ejemplo de uso.
Amir
2

Esta respuesta tiene una sola línea, basada en who& grep

/ubuntu//a/230838/152287

who puede abreviarse como w

Puede leer más en el enlace que incluye una línea para obtener el valor.

Funciona. Aquí está la salida raspberrypi (rasbian), donde el valor de visualización está en la columna FROM

tim@raspberrypi:~ $ w
 19:19:30 up  8:15,  2 users,  load average: 0.12, 0.11, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty7     :0               11:04    8:15m  1:15   0.89s /usr/bin/lxsess
tim      pts/0    192.168.0.29     19:17    0.00s  1.00s  0.09s w
Tim Richardson
fuente
1

https://gitorious.org/termsql/pages/Home

termsql es una buena herramienta para extraer información como esa.

Encontrar el número de PANTALLA es uno de los ejemplos:

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(establezca la variable de entorno DISPLAY en la pantalla en la que se está ejecutando X en este momento, suponiendo que se llame al binario X Xorg.bin)

Ano
fuente
1

Una pequeña variación en la respuesta de Amir.

ps egenerará el entorno de cada comando, con un espacio separado para que se pueda pasar directamente seda filtrar DISPLAY, dando un comando más simple que leer / proc / PID / environment directamente. (Sin embargo, para leer los entornos de otros usuarios aún necesita permisos de root).

Este código generará los nombres de todos los usuarios conectados con X sesiones, y sus números DISPLAY:

#!/bin/bash
declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
johnraff
fuente