Jak sprawdzić, które procesy mają ustawioną zmienną DISPLAY?


8

Czasami mam problemy z wyświetlaniem i głównie chcę wiedzieć, które pliki lub procesy używają zmiennej środowiskowej DISPLAY.

Jak wyświetlić listę wszystkich procesów, które mają ustawiony DISPLAY?

Odpowiedzi:


13

Podszedłem do tego polecenia po wielu wyszukiwaniach i próbach:

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

Przykładem wyniku jest:

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
Niezłe rozwiązanie. Czy mógłbyś dodać wyjaśnienie tego, co dzieje się za sceną? Ponadto dane wyjściowe są przycięte, co mogę zrobić, aby uzyskać pełne nazwy procesów?
Danatela,

1
To polecenie wyszukuje rekurencyjnie w katalogu / proc. grep dla DISPLAYkażdego pliku. Te pliki są w trakcie działania, więc każdy plik zawierający słowo DISPLAYoznacza, że ​​ten proces go używa. Nie możesz uzyskać pełnej nazwy procesu, ponieważ nazwy na wyjściu są nazwami założonymi, /procwięc po prostu nie możesz wiedzieć więcej niż oferowana.
Maythux,

1
Zamiast tego edytuj swoją odpowiedź i po prostu poinformuj użytkownika, że ​​zaktualizowałeś swój post.
Braiam

Zepsułem zmienną DISPLAY env i chciałem wiedzieć, jakie były wartości DISPLAY, zanim ją zmieniłem, nie znam żadnego commada, który mógłby mi powiedzieć o jego historii, więc za pomocą tego polecenia dowiedziałem się, które wcześniejsze procesy miały użyłem, która wartość WYŚWIETLACZA i mój problem został rozwiązany.
yaxe

1

Po niewielkiej modyfikacji skryptu Maythux możemy również uzyskać PID procesów za pomocą zmiennej 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

Dane wyjściowe to:

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

To całkiem fajne skrypty z wiersza poleceń! Zrobię kopię tego skryptu na wypadek, gdybym musiał go zhakować, żeby wymyślić coś innego.

Idealnie wszystkie obecne procesy, które odpowiadają programom uruchamianym na komputerze lokalnym, po zalogowaniu, będą miały tę samą zmienną wyświetlania, co pierwsza otwarta konsola pts (sesja pseudo-terminalowa).

Na przykład, gdy otworzysz pierwszą sesję terminala (gnome-terminal) i uruchomisz komendę who lub w, zauważysz następujące wyniki:

$ who

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

lub niektórzy ludzie mogą wyglądać tak (ale nie w twoim przypadku)

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

za pomocą menedżera wyświetlania światła, jeśli zmienna DISPLAY jest ustawiona inaczej dla wykonania powłok po zalogowaniu (np .: 0,0), to zmienna środowiskowa dla DISPLAY dałaby tę samą zmienną wyświetlania, jak zmienna wyświetlania po zalogowaniu dla pierwszych otwartych pkt (: 0.0), ale zmienna hosta, przy logowaniu, nadal będzie (: 0).

Przez echo zmiennej DISPLAY lub uruchomienie zestawu potoków do mniej, jak pokazano poniżej:

:~$ echo $DISPLAY

lub

:~$ set | less

możesz także sprawdzić bieżącą zmienną wyświetlaną sesji i zobaczyć, co jest ustawione, do wykonania powłoki po zalogowaniu. Zasadniczo więc zmienna wyświetlana procesów, które wykonujesz, będzie miała tę samą zmienną wyświetlaną, co twoje pierwsze otwarte pts, po zalogowaniu.

Dane wyjściowe skryptu, który opublikowałeś, sugerują, że twoje pierwsze otwarte punkty będą miały tę samą zmienną wyświetlania, co login menedżera wyświetlania, w tym przypadku: 0.

Teraz w drugim przykładzie dane wyjściowe wyglądałyby mniej więcej tak:

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)

Również dla dodatkowej lektury możesz zajrzeć na strony podręcznika ptmx

$ man ptmx

Może to dać ci wgląd w relację pseudo-terminali.

Mam nadzieję, że to pomoże!

Skąd masz ten skrypt?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.