Come ottenere il numero del display mi è stato assegnato da X


20

Dalle pagine man di 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.

Come posso trovare il numero del display che mi è stato assegnato?

Oppure elenca i display attualmente aperti e i loro utenti?

Risposte:


29

Se si conosce un ID processo in esecuzione nella sessione dell'utente e si dispone dell'autorizzazione per accedere alle informazioni di tale processo, è possibile eseguire il grep del suo ambiente per la DISPLAYvariabile:

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

Ad esempio, per elencare tutti i display principali utilizzati dall'UID sul computer corrente, utilizzare:

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

Se hai effettuato l'accesso a una sola sessione X, quanto sopra dovrebbe generare solo una riga con qualcosa di simile :0.


Nota: se si desidera utilizzare questo su una riga, è necessario aggiungere un ;prima di done.
not2qubit

@utente1147688 grazie, ma anche un personaggio newline funziona altrettanto bene, almeno nelle shell che uso (Bash e Dash).
Amir,

Fantastico! Grazie. L'ho rubato per unix.stackexchange.com/a/429162/12574 con alcuni miglioramenti;)
Gilles Quenot

11

Nella sessione X, puoi sempre consultare la DISPLAYvariabile di ambiente per ottenere il numero di visualizzazione corrente ( echo $DISPLAY).

Scoprire i numeri visualizzati dagli altri è più difficile. Non credo che ci sia un modo standard per ottenere le informazioni se non quello di chiedere a tutti gli utenti a cui sono collegati, quindi ogni tentativo di ottenere queste informazioni richiede una sorta di hacking e non funzionerà in tutti i casi.

Ci sono alcune opzioni date altrove in SE ma non funzioneranno su Debian Wheezy, per esempio. Tuttavia, elencare i display attualmente attivi è facile, come mostrato nel post che ho linkato sopra:

ps axu | grep "X " ti mostrerà i processi X attualmente in esecuzione, qualcosa di simile al seguente:

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

Il primo parametro successivo /usr/bin/Xè il numero visualizzato con i due punti, e il successivo mostra il terminale virtuale assegnato alla sessione.

Potresti ottenere una risposta dall'elenco dei processi, tuttavia:

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

Guarda le righe dopo /usr/bin/X: all'avvio della sessione X, un gestore di finestre viene in genere avviato come l'utente a cui appartiene la sessione e lì ottieni il nome utente. Nel mio caso user_1 sta usando KDE e user_2 sta usando LXDE. Tuttavia, questa soluzione si basa esclusivamente sul fatto che il kernel stia assegnando nuovi ID di processo in sequenza crescente, il che potrebbe non essere sempre il caso.


Grazie, consultare DISPLAY è la risposta che penso. Tuttavia, la variabile DISPLAY potrebbe non essere aggiornata. Questo mi è successo quando mi sono ricollegato a una sessione dello schermo . Ha fatto sì che le cose grafiche non funzionassero. L'ho risolto staccando, facendo eco a DISPLAY, ricollegando e impostando DISPLAY sul nuovo valore.
ricab,

Linux espone l'ambiente di ogni processo sotto /proc/$pid/environ, come in cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Vedi la mia risposta per un altro esempio di utilizzo.
Amir,

2

Questa risposta ha una riga, basata su who& grep

/ubuntu//a/230838/152287

who può essere abbreviato come w

puoi leggere di più sul link incluso un one-liner per ottenere il valore.

Funziona. Ecco l'output di raspberrypi (rasbian), dove il valore di visualizzazione è nella colonna 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

1

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

termsql è un buon strumento per estrarre informazioni del genere.

Scoprire il numero DISPLAY è uno degli esempi:

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

(imposta la variabile di ambiente DISPLAY su quale display X è attualmente in esecuzione, supponendo che venga chiamato il binario X Xorg.bin)


1

Una piccola variazione sulla risposta di Amir.

ps eprodurrà l'ambiente di ciascun comando, lo spazio separato in modo che possa essere passato direttamente sedal filtro DISPLAY, dando un comando più semplice rispetto alla lettura / proc / PID / environment direttamente. (Per leggere gli ambienti di altri utenti devi comunque avere i permessi di root.)

Questo codice genererà i nomi di tutti gli utenti che hanno effettuato l'accesso con sessioni X e i loro numeri 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.