Como obter o número de exibição me foi atribuído por X

19

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 atualmente abertas e seus usuários?

ricab
fonte

Respostas:

26

Se você souber de um ID de processo em execução na sessão do usuário e tiver permissão para acessar as informações desse processo, poderá consultar seu ambiente para a DISPLAYvariável:

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

Como exemplo, para listar todas as telas principais usadas pelo seu UID no computador atual, 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

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

Emir
fonte
Nota: Se você quiser usar isso em uma linha, você precisa adicionar um ;antes do done.
Not2qubit
@ user1147688 Obrigado, mas um caractere de nova linha funciona tão bem, pelo menos nos shells que eu uso (Bash e Dash).
Amir
Brillant! Obrigado. Eu roubei isso para unix.stackexchange.com/a/429162/12574 com algumas melhorias;)
Gilles Quenot
11

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

Descobrir os números de exibição dos 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, portanto, 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 " irá 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 depois /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 conseguir que você responda olhando a lista de processos, embora:

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 depois /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 lá 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, essa solução depende exclusivamente do fato de que o kernel está atribuindo novos IDs de processo em seqüência crescente, o que pode não ser o caso sempre.

zagrimsan
fonte
Obrigado, consultando DISPLAY é a resposta que eu penso. No entanto, a variável DISPLAY pode estar desatualizada. Isso aconteceu comigo ao me reconectar a uma sessão de tela . Isso fez com que as coisas gráficas não funcionassem. Eu resolvi isso desanexando, fazendo eco no DISPLAY, reconectando e definindo DISPLAY para o novo valor.
ricab
Linux expõe o ambiente de cada processo /proc/$pid/environ, como em cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Veja minha resposta para outro exemplo de uso.
Amir
2

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

https://askubuntu.com/a/230838/152287

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
Tim Richardson
fonte
1

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

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")

(configure 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 Xorg.bin)

Ano
fonte
1

Uma pequena variação na resposta de Amir.

ps eirá gerar o ambiente de cada comando, separado por espaço para que possa ser passado diretamente sedpara o filtro DISPLAY, dando 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.)

Esse código mostrará os nomes de todos os usuários conectados 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]*).*/\1/p');do
        disps[$i]=$u
    done
done

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