Como obter o número de exibição Fui designado por X

16

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.

Como posso encontrar o número de exibição que me foi atribuído?

Ou listar exibições abertas no momento e seus usuários?

    
por ricab 19.09.2013 / 12:08

5 respostas

23

Se você souber de um código de processo em execução na sessão do usuário e tiver permissão para acessar as informações desse processo, poderá definir seu ambiente para a variável DISPLAY :

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

Como exemplo, para listar todas as exibições principais usadas pelo seu UID no computador atual, use:

%pre%

Se você está logado em apenas uma sessão X, o acima deve mostrar apenas uma linha com algo como :0 .

    
por 20.09.2015 / 11:36
10

Na sessão X, você sempre pode consultar a variável de ambiente DISPLAY para obter o número de exibição atual ( echo $DISPLAY ).

Descobrir os números de exibição outros é mais difícil. Eu não acho que exista uma maneira padrão de obter as informações além de perguntar a todos os usuários que exibem que estão conectados, então qualquer tentativa de obter essas informações requer algum tipo de hackeria e não funcionará para todos os casos.

Existem algumas opções dadas em outros lugares no SE , mas elas não funcionam no Debian Wheezy, por exemplo. No entanto, listar as exibições atualmente ativas é fácil, conforme mostrado na postagem vinculada acima:

ps axu | grep "X " mostrar-lhe-á os processos X que estão atualmente em execução, algo como o seguinte:

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

O primeiro parâmetro após /usr/bin/X é o número de exibição prefixado por dois pontos, e o próximo mostra o terminal virtual atribuído à sessão.

Você pode obter uma resposta da lista de processos:

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

Observe as linhas após /usr/bin/X - quando a sessão X é iniciada, um gerenciador de janelas normalmente é iniciado como o usuário ao qual a sessão pertence e você obtém o nome de usuário. No meu caso, o user_1 está usando o KDE e o user_2 está usando o LXDE. No entanto, esta solução baseia-se puramente no fato de que o kernel está atribuindo novos IDs de processo em uma seqüência crescente, o que pode não ser o caso sempre.

    
por 19.09.2013 / 13:03
2

Esta resposta tem um one-liner, baseado em who & grep

link

who pode ser abreviado como w

você pode ler mais no link, incluindo um one-liner para obter o valor.

Funciona. Aqui está a saída raspberrypi (rasbian), em que o valor de exibição está na coluna 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
    
por 23.07.2018 / 11:23
1

link

termsql é uma boa ferramenta para extrair informações como essa.

Descobrir o número do DISPLAY é um dos exemplos:

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

(defina a variável de ambiente DISPLAY para a exibição em que o X está sendo executado agora, supondo que o binário X seja chamado de Xorg.bin )

    
por 22.11.2014 / 15:05
1

Uma pequena variação na resposta de Amir.

ps e produzirá o ambiente de cada comando, separado por espaço para poder ser transmitido diretamente para sed para filtrar DISPLAY, fornecendo um comando mais simples do que lendo / proc / PID / environ diretamente. (Para ler os ambientes de outros usuários, você ainda precisa de permissões de root.)

Este código mostrará os nomes de todos os usuários logados com sessões X e seus números de exibição:

#!/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]*).*//p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
    
por 09.09.2016 / 06:23