Comment obtenir le numéro d'affichage qui m'a été attribué par X

20

À partir des pages de manuel X (7)

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.

Comment puis-je trouver le numéro d'affichage qui m'a été attribué?

Ou lister les écrans actuellement ouverts et leurs utilisateurs?

ricab
la source

Réponses:

29

Si vous connaissez un ID de processus en cours d'exécution dans la session de l'utilisateur et que vous êtes autorisé à accéder aux informations de ce processus, vous pouvez grep son environnement pour la DISPLAYvariable:

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

Par exemple, pour répertorier tous les affichages principaux utilisés par votre UID sur l'ordinateur actuel, utilisez:

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 vous n'êtes connecté qu'à une seule session X, ce qui précède ne devrait produire qu'une seule ligne avec quelque chose comme :0.

Amir
la source
Remarque: Si vous souhaitez utiliser ceci sur une seule ligne, vous devez ajouter un ;avant le done.
not2qubit
@ user1147688 merci, mais un caractère de nouvelle ligne fonctionne aussi bien, au moins dans les shells que j'utilise (Bash et Dash).
Amir
Brillant! Merci. J'ai volé cela pour unix.stackexchange.com/a/429162/12574 avec quelques améliorations;)
Gilles Quenot
11

Dans la session X, vous pouvez toujours consulter la DISPLAYvariable d'environnement pour obtenir votre numéro d'affichage actuel ( echo $DISPLAY).

Trouver les numéros d'affichage des autres est plus difficile. Je ne pense pas qu'il existe un moyen standard d'obtenir les informations autre que de demander à tous les utilisateurs auxquels ils sont connectés, donc toute tentative d'obtenir ces informations nécessite une sorte de piratage et ne fonctionnera pas dans tous les cas.

Il y a quelques options données ailleurs dans SE mais elles ne fonctionneront pas sur Debian Wheezy, par exemple. Cependant, répertorier les écrans actuellement actifs est facile, comme le montre l'article que j'ai lié ci-dessus:

ps axu | grep "X " vous montrera les processus X en cours d'exécution, quelque chose comme ceci:

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

Le premier paramètre après /usr/bin/Xest le numéro d'affichage préfixé par deux points, et le suivant vous montre le terminal virtuel affecté à la session.

Vous pourriez obtenir votre réponse en consultant la liste des processus, cependant:

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

Regardez les lignes après /usr/bin/X- lorsque la session X démarre, un gestionnaire de fenêtres est généralement démarré en tant qu'utilisateur auquel appartient la session, et là vous obtenez le nom d'utilisateur. Dans mon cas, user_1 utilise KDE et user_2 utilise LXDE. Cependant, cette solution repose uniquement sur le fait que le noyau attribue de nouveaux ID de processus dans un ordre croissant, ce qui n'est pas toujours le cas.

zagrimsan
la source
Merci, consulter DISPLAY est la réponse je pense. Cependant, la variable DISPLAY peut être obsolète. Cela m'est arrivé lors du rattachement à une session d' écran . Cela a empêché les choses graphiques de fonctionner. Je l'ai résolu en détachant, en faisant écho à DISPLAY, en rattachant et en réglant DISPLAY sur la nouvelle valeur.
ricab
Linux expose l'environnement de chaque processus sous /proc/$pid/environ, comme dans cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Voir ma réponse pour un autre exemple d'utilisation.
Amir
2

Cette réponse a une ligne unique, basée sur who& grep

/ubuntu//a/230838/152287

who peut être abrégé en w

vous pouvez en savoir plus sur le lien, y compris un one-liner pour obtenir la valeur.

Ça marche. Voici la sortie de raspberrypi (rasbian), où la valeur d'affichage est dans la colonne 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
la source
1

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

termsql est un bon outil pour extraire de telles informations.

Trouver le numéro DISPLAY est l'un des exemples:

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

(définissez la variable d'environnement DISPLAY sur quel affichage X s'exécute actuellement, en supposant que le binaire X est appelé Xorg.bin)

Ano
la source
1

Une petite variation sur la réponse d'Amir.

ps eaffichera l'environnement de chaque commande, séparé par un espace afin qu'il puisse être transmis directement à sedpour filtrer DISPLAY, donnant une commande plus simple que de lire / proc / PID / environ directement. (Cependant, pour lire les environnements d'autres utilisateurs, vous avez toujours besoin des autorisations root.)

Ce code affichera les noms de tous les utilisateurs connectés avec des sessions X et leurs numéros 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
la source