Comment find le numéro actuel (actif) XServer DISPLAY?

J'utilise Arch Linux et les choses ne sont pas si faciles quand vous essayez de découvrir l'affichage Xorg actuel (pas à travers la variable env).

Voici un exemple de travail:

$ cat /sys/class/tty/tty0/active tty2 who | awk -v term="tty2" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }' :0 

Cela fonctionne dans certains cas, dans d'autres pas:

 $ cat /sys/class/tty/tty0/active tty3 who | awk -v term="`cat /sys/class/tty/tty0/active`" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }' NOTHING 

Cause:

 $ who uzumaki tty2 2015-05-16 10:50 (:0) guest pts/2 2015-05-16 11:47 (:1) uzumaki tty4 2015-05-16 11:07 

L'user invité (tty3) a lancé sa session en utilisant pts (pseudo-terminal).

J'utilise gdm et il lance les servers xorg sans command spécifique (ne précise pas le numéro d'affichage).

 $ ps au | grep -e Xorg -e vt uzumaki 788 1.4 0.9 740464 150672 tty2 Sl+ 10:50 5:38 /usr/lib/xorg-server/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolistn tcp -background none -noreset -keeptty -verbose 3 guest 1062 0.0 0.1 465748 32344 tty3 Sl+ 10:51 0:19 /usr/lib/xorg-server/Xorg vt3 -displayfd 3 -auth /run/user/1002/gdm/Xauthority -nolistn tcp -background none -noreset -keeptty -verbose 3 

Donc, le million de questions est: Comment find le numéro actuel (en cours d'utilisation) XServer DISPLAY? Courant car, comme ci-dessus, nous pouvons avoir plusieurs servers (plusieurs users).

Vous pouvez essayer d'utiliser loginctl list-sessions pour get la list des sessions, puis utiliser loginctl show-session -p Display -p Active <session ID> pour get le numéro d'affichage X11 associé à la session active.

Quelque chose comme ça (en bash):

 TARGET_DISPLAY=() while read id uid user seat; do while IFS='=' read property value; do case "$property" in Active) if [[ "$value" != "yes" ]]; then continue; fi ;; Display) if [[ "$value" ]]; then TARGET_DISPLAY+=( "$value" ) fi # else the session isn't graphical ;; esac done < <(loginctl show-session -p Display -p Active "$id") done < <(loginctl list-sessions --no-legend) 

Ici, le $TARGET_DISPLAY est un tableau, car hypothétiquement il peut y avoir plus d'une session active (sur un système multi-sièges). Si cela n'est pas possible dans votre configuration, vous pouvez en faire une simple variable et append une instruction break 2 après l'affectation pour quitter les deux loops.

TOUTEFOIS…

… cela ne fonctionne plus avec GDM, car dans ce cas, le server X est démarré à l' intérieur de la session (avec les logind d'user) et /usr/bin/gdm-x-session ne transmet pas cette information à logind manque d'API pour ça).

Dans d'autres cas (lorsque le server X est démarré par le DM avant la création de la session), cela fonctionnera très probablement. Je ne suis pas au courant d'autres methods, désolé.

Eh bien, en tant que courant, je veux dire l'affichage actif d'un server XOrg. Rappelez-vous que nous pouvons avoir plus d'un server XOrg en cours d'exécution et qu'ils peuvent être multi-têtes, ce qui rend les choses plus difficiles à manipuler.

L'autre note importante est que la variable DISPLAY n'est pas accessible dans certains cas (par exemple, systemd).

Après une discussion dans commandlinefu , j'ai eu ce résultat:

 for p in $(pgrep -t $(cat /sys/class/tty/tty0/active)); do d=$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' /proc/$p/environ 2>/dev/null); [[ -n $d ]] && break; done; echo $d 

Cet extrait itère sur une list de tous les process (en fait leurs ID) où le terminal de contrôle est défini et correspond au terminal de ce process. Il vérifie l'environnement de chaque process pour la variable DISPLAY et est satisfait dès qu'il en trouve un. Après avoir trouvé une variable DISPLAY , il arrête d'itérer la list et echo le résultat.

Cela imprimera l'affichage actif qui exécute le script.

Le script suivant répertorie le nom d'user et le numéro d'affichage pour les users connectés lorsque le terminal correspondant est actif.

 w -hs | \ awk -v tty="$(cat /sys/class/tty/tty0/active)" \ '$2 == tty && $3 != "-" {print $1 FS $3}' 

Résultat:

myuser: 0