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

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

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

3 ответа

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

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 мы также можем получить 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)

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

В идеале все текущие процессы, которые соответствуют программам, которые вы выполняете на локальном компьютере, после входа в систему, должны иметь ту же переменную отображения, что и ваша первая открытая консоль 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

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

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

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

Другие вопросы по тегам