Respostas:
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)
DISPLAY
em cada arquivo. Esses arquivos estão realmente nos processos em execução; portanto, cada arquivo que contém a palavra DISPLAY
significa 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; /proc
portanto, você não pode saber mais do que o oferecido.
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)
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?