Ответы:
Я пришел к этой команде после многих поисков и попыток:
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)
DISPLAY
каждого файла. Эти файлы в действительности выполняются процессами, поэтому каждый файл, содержащий слово, DISPLAY
означает, что этот процесс использует его. Вы не можете получить полное имя процесса, так как имена в выводе являются именами основанных файлов, /proc
поэтому вы просто не можете знать больше, чем предлагается.
Небольшой модификацией скрипта 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
Это может дать вам некоторое представление о взаимоотношениях мастер-раб псевдо-терминалов.
Надеюсь, это поможет!
Кроме того, где вы взяли этот сценарий?