Как узнать, в каких процессах установлена ​​переменная DISPLAY?

8

Иногда я сталкиваюсь с некоторыми проблемами при отображении, и в основном я хочу знать, какие файлы или процессы используют переменную окружения DISPLAY.

Так как же перечислить все процессы, для которых установлен DISPLAY?

Maythux
источник

Ответы:

13

Я пришел к этой команде после многих поисков и попыток:

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

Пример вывода:

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
источник
1
Хорошее решение. Не могли бы вы добавить объяснение того, что происходит за кулисами? Кроме того, вывод обрезан, что я могу сделать, чтобы получить полные имена процессов?
Данатела
1
Эта команда выполняет рекурсивный поиск в каталоге / proc. grep для DISPLAYкаждого файла. Эти файлы в действительности выполняются процессами, поэтому каждый файл, содержащий слово, DISPLAYозначает, что этот процесс использует его. Вы не можете получить полное имя процесса, так как имена в выводе являются именами основанных файлов, /procпоэтому вы просто не можете знать больше, чем предлагается.
Maythux
1
ПОЖАЛУЙСТА, вместо этого отредактируйте свой ответ и просто сообщите пользователю, что вы обновили свой пост.
Брайам
Я испортил переменную DISPLAY env и хотел узнать, каковы были значения DISPLAY, прежде чем я изменил его, я не знаю ни одного запятого, который мог бы рассказать мне об его истории, поэтому с помощью этой команды я обнаружил, какие более ранние процессы имели использовал значение DISPLAY и моя проблема была решена.
Якс
1

Небольшой модификацией скрипта Maythux мы также можем получить PID процессов, используя переменную 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

Выход:

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
источник
0

Вот некоторые изящные скрипты командной строки! Я собираюсь сделать копию этого сценария на случай, если мне придется взломать его, чтобы придумать что-то еще.

В идеале все текущие процессы, которые соответствуют программам, которые вы выполняете на локальном компьютере, после входа в систему, должны иметь ту же переменную отображения, что и ваша первая открытая консоль pts (псевдо-терминал).

Например, когда вы открываете свой первый сеанс терминала (gnome-терминал) и запускаете команду who или w, вы заметите некоторый вывод:

$ who

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

или некоторые люди могут выглядеть так (но не ваш случай)

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

с помощью диспетчера отображения света, если переменная DISPLAY установлена ​​по-разному для выполнения оболочек после входа в систему (например, 0.0), тогда переменная среды для DISPLAY выдаст ту же переменную отображения, что и переменная отображения после входа первых открытых точек (: 0.0), но переменная хоста при входе в систему все равно будет (: 0).

Повторяя переменную DISPLAY или запустив set piped на less, как показано ниже:

:~$ echo $DISPLAY

или

:~$ set | less

Вы также можете проверить текущую переменную отображения ваших сеансов и посмотреть, на что она установлена, для выполнения оболочек после входа в систему. Таким образом, в основном переменная отображения процессов, которые вы выполняете, будет иметь ту же переменную отображения, что и ваши первые открытые точки, после входа в систему.

Вывод сценария, который вы опубликовали, предполагает, что ваши первые открытые точки будут иметь ту же переменную отображения, что и логин вашего диспетчера отображения, в данном случае: 0.

Теперь для второго примера вывод будет выглядеть примерно так:

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)

Также для дополнительного чтения вы можете посмотреть справочные страницы для ptmx

$ man ptmx

Это может дать вам некоторое представление о взаимоотношениях мастер-раб псевдо-терминалов.

Надеюсь, это поможет!

Кроме того, где вы взяли этот сценарий?

oOpSgEo
источник