Как узнать, в каких процессах установлена переменная 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
Это может дать вам некоторое представление о взаимоотношениях "мастер-раб" псевдо-терминалов.
Надеюсь, это поможет!
Кроме того, где вы взяли этот сценарий?