Come sapere quali processi hanno impostato la variabile DISPLAY?


8

A volte incontro alcuni problemi nella visualizzazione e per lo più voglio sapere quali file o processi utilizzano la variabile di ambiente DISPLAY.

Quindi, come elencare tutti i processi che hanno impostato DISPLAY?

Risposte:


13

Sono arrivato a questo comando dopo molte ricerche e tentativi:

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/'

Un esempio dell'output è:

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)

1
Bella soluzione. Potresti per favore aggiungere qualche spiegazione per ciò che accade dietro la scena? Inoltre, l'output è ritagliato, cosa posso fare per ottenere i nomi dei processi completi?
Danatela,

1
Questo comando cerca ricorsivamente nella directory / proc. grep per DISPLAYogni file. Quei file sono in realtà i processi in esecuzione, quindi ogni file contenente la parola DISPLAYsignifica che questo processo lo sta utilizzando. Non è possibile ottenere il nome completo del processo poiché i nomi nell'output sono i nomi dei file trovati ion /procquindi semplicemente non si può sapere più di quello offerto.
Maythux,

1
Per favore, modifica invece la tua risposta e informa l'utente che hai aggiornato il tuo post.
Braiam

Avevo incasinato la variabile env DISPLAY e volevo sapere quali fossero i valori di DISPLAY prima di cambiarlo, non conosco nessun comando che potesse parlarmi della sua storia, quindi usando questo comando ho scoperto quali processi precedenti avevano utilizzato quale valore DISPLAY e il mio problema è stato risolto.
yaxe,

1

Con una piccola modifica allo script Maythux, possiamo anche ottenere il PID dei processi usando la variabile 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

L'output è:

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)

0

Ecco alcuni script di riga di comando piuttosto eleganti! Ne farò una copia in quella sceneggiatura nel caso dovessi hackerarla per capire qualcos'altro.

Idealmente tutti i processi correnti che corrispondono ai programmi che esegui sul computer locale, dopo l'accesso, porteranno la stessa variabile di visualizzazione della tua prima console pts aperta (sessione pseudo-terminale).

Ad esempio, quando apri la tua prima sessione di terminale (gnome-terminal) ed esegui il comando who o w noterai alcuni output come questo:

$ who

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

o alcune persone potrebbero apparire così (ma non è il tuo caso)

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

usando il display display light se la variabile DISPLAY è impostata diversamente per l'esecuzione post-login delle shell (es. 0.0), la variabile d'ambiente per DISPLAY produrrebbe la stessa variabile display della variabile display post-login dei primi punti aperti (: 0.0), ma la variabile host, al momento dell'accesso, sarebbe comunque (: 0).

Facendo eco alla variabile DISPLAY, o eseguendo il set impostato su less come mostrato di seguito:

:~$ echo $DISPLAY

o

:~$ set | less

puoi anche controllare la variabile di visualizzazione corrente delle tue sessioni e vedere su cosa è impostata, per l'esecuzione post shell delle shell. Quindi sostanzialmente la variabile di visualizzazione dei processi che esegui, avrà la stessa variabile di visualizzazione dei tuoi primi punti aperti, dopo l'accesso.

L'output dello script che hai postato suggerisce che i tuoi primi pts aperti avranno la stessa variabile di visualizzazione dell'account di accesso del tuo display manager, in questo caso: 0.

Ora per il secondo esempio l'output sarebbe simile a questo:

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)

Inoltre per ulteriori letture puoi consultare le pagine man di ptmx

$ man ptmx

Questo potrebbe darti un'idea della relazione master-slave degli pseudo-terminali.

Spero che questo possa essere d'aiuto!

Inoltre dove hai preso quella sceneggiatura?

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.