Como saber quais processos têm a variável DISPLAY definida?

8

Às vezes, encontro alguns problemas na exibição e, principalmente, quero saber quais arquivos ou processos estão usando a variável de ambiente DISPLAY.

Então, como listar todos os processos que possuem o DISPLAY definido?

Maythux
fonte

Respostas:

13

Eu vim para este comando depois de muitas pesquisas e tentativas:

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '(.*)' $file/stat; done | sed 'N;s/\n/\t/'

Uma amostra da saída é:

DISPLAY=:0  (unity-files-dae)
DISPLAY=:0  (unity-music-dae)
DISPLAY=:0  (unity-lens-vide)
DISPLAY=:0  (zeitgeist-daemo)
DISPLAY=:0  (zeitgeist-fts)
DISPLAY=:0  (zeitgeist-datah)
DISPLAY=:0  (cat)
DISPLAY=:0  (unity-scope-vid)
DISPLAY=:0  (unity-musicstor)
DISPLAY=:0  (dconf-service)
DISPLAY=:0  (gdu-notificatio)
DISPLAY=:0  (telepathy-indic)
DISPLAY=:0  (mission-control)
DISPLAY=:0  (goa-daemon)
DISPLAY=:0  (VBoxXPCOMIPCD)
Maythux
fonte
1
Ótima solução. Poderia, por favor, adicionar uma explicação para o que acontece nos bastidores? Além disso, a saída é cortada, o que posso fazer para obter os nomes completos dos processos?
Danatela 11/03/14
1
Este comando procura recursivamente no diretório / proc. grep para o DISPLAYem cada arquivo. Esses arquivos estão realmente nos processos em execução; portanto, cada arquivo que contém a palavra DISPLAYsignifica que esse processo está sendo usado. Você não pode obter o nome completo do processo, pois os nomes na saída são os nomes dos arquivos fundados; /procportanto, você não pode saber mais do que o oferecido.
Maythux 11/03/14
1
Por favor, edite sua resposta e informe ao usuário que você atualizou sua postagem.
Braiam
Eu tinha estragado a variável env DISPLAY e queria saber quais eram os valores de DISPLAY antes de alterá-la. Não conheço nenhum nômade que possa me contar sobre sua história; portanto, usando este comando, descobri quais processos anteriores tinham usou qual valor de DISPLAY e meu problema foi resolvido.
yaxe 27/02/19
1

Com uma pequena modificação no script do Maythux, também podemos obter o PID dos processos usando a variável DISPLAY.

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '[0-9]* (.*)' $file/stat; done | sed 'N;s/\n/\t/' |column -t |sort -n -k2

A saída é:

DISPLAY=:0  590    (lxsession)
DISPLAY=:0  645    (unclutter)
DISPLAY=:0  705    (gvfsd)
DISPLAY=:0  710    (gvfsd-fuse)
DISPLAY=:0  727    (openbox)
DISPLAY=:0  729    (lxpolkit)
DISPLAY=:0  732    (lxpanel)
DISPLAY=:0  734    (pcmanfm)
DISPLAY=:0  772    (menu-cached)
DISPLAY=:0  781    (gvfs-udisks2-vo)
DISPLAY=:0  791    (gvfs-gphoto2-vo)
DISPLAY=:0  795    (gvfs-mtp-volume)
DISPLAY=:0  799    (gvfs-afc-volume)
DISPLAY=:0  804    (gvfs-goa-volume)
DISPLAY=:0  816    (gvfsd-trash)
DISPLAY=:0  21053  (npm)
DISPLAY=:0  21102  (sh)
DISPLAY=:0  21103  (sh)
DISPLAY=:0  21104  (node)
DISPLAY=:0  21110  (electron)
DISPLAY=:0  21112  (electron)
DISPLAY=:0  21149  (electron)
DISPLAY=:0  21154  (electron)
DISPLAY=:0  21180  (rec)
not2qubit
fonte
0

Isso é um script de linha de comando bastante bacana! Vou fazer uma cópia desse script, caso eu precise hackear para descobrir outra coisa.

Idealmente, todos os processos atuais que correspondem aos programas que você executa na máquina local, após o login, terão a mesma variável de exibição do seu primeiro console de pts abertos (sessão de pseudo-terminal).

Por exemplo, quando você abre sua primeira sessão de terminal (gnome-terminal) e executa o comando who ou w, notará alguma saída como esta:

$ who

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0)

ou algumas pessoas podem ficar assim (mas não é o seu caso)

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0.0)

usando o gerenciador de exibição de luz se a variável DISPLAY estiver configurada de maneira diferente para a execução de shells pós-login (por exemplo: 0,0), a variável de ambiente para DISPLAY produzirá a mesma variável de exibição que a variável de exibição pós-login dos primeiros pts abertos (: 0.0), mas a variável host, no login, ainda seria (: 0).

Fazendo eco na variável DISPLAY ou executando o conjunto canalizado para menos, como mostrado abaixo:

:~$ echo $DISPLAY

ou

:~$ set | less

você também pode verificar a variável de exibição atual de suas sessões e ver o que está definido para execução pós-login de shells. Então, basicamente, a variável de exibição dos processos que você executa, terá a mesma variável de exibição que seus primeiros pts abertos, após o login.

A saída do script que você postou sugere que seus primeiros pts abertos terão a mesma variável de exibição que o login do seu gerente de exibição, neste caso: 0.

Agora, para o segundo exemplo, a saída seria algo como isto:

DISPLAY=:0.0    (gvfs-udisks2-vo)
DISPLAY=:0.0    (zeitgeist-daemo)
DISPLAY=:0.0    (zeitgeist-fts)
DISPLAY=:0.0    (zeitgeist-datah)
DISPLAY=:0.0    (gvfs-mtp-volume)
DISPLAY=:0.0    (gvfs-gphoto2-vo)
DISPLAY=:0.0    (gvfs-afc-volume)
DISPLAY=:0.0    (geyes_applet2)
DISPLAY=:0.0    (indicator-apple)
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (python)
DISPLAY=:0.0    (gvfsd-trash)
DISPLAY=:0.0    (indicator-keybo)
DISPLAY=:0.0    (gvfsd-burn)
DISPLAY=:0.0    (cat) 
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (gnome-terminal)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (sed)

Também para leitura adicional, você pode consultar as páginas de manual do ptmx

$ man ptmx

Isso pode lhe dar algumas dicas sobre o relacionamento mestre-escravo de pseudo-terminais.

Eu espero que isso ajude!

Também onde você conseguiu esse script?

oOpSgEo
fonte