如何知道哪些进程设置了 DISPLAY 变量?

如何知道哪些进程设置了 DISPLAY 变量?

有时我会遇到一些显示问题,大多数时候我都想知道哪些文件或进程正在使用 DISPLAY 环境变量。

那么如何列出所有设置了 DISPLAY 的进程?

答案1

经过多次搜索和尝试后我找到了这个命令:

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)

为了解释发生了什么,这个循环在目录中递归搜索/proc每个DISPLAY文件。这些文件实际上是正在运行的进程,因此每个包含单词 DISPLAY 的文件都意味着该进程正在使用它。

答案2

对 Maythux 脚本进行少量修改后,我们还可以使用 DISPLAY 变量获取进程的 PID。

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)

答案3

理想情况下,登录后,与您在本地机器上执行的程序相对应的所有当前进程都将携带与您第一个打开的 pts(伪终端会话)控制台相同的显示变量。

例如,当您打开第一个终端会话(gnome-terminal)并运行 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 变量对于登录后执行 shell 的设置不同(例如:0.0),则 DISPLAY 的环境变量将产生与第一个打开的 pts 的登录后显示变量相同的显示变量(:0.0),但登录时的主机变量仍为(:0)。

通过回显 DISPLAY 变量,或者运行 set piped 到 less,如下所示:

:~$ echo $DISPLAY

或者

:~$ set | less

您还可以检查会话当前的显示变量,并查看它为登录后执行 shell 所设置的值。因此,基本上,您执行的进程的显示变量将具有与您登录后第一次打开的 pts 相同的显示变量。

脚本的输出

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

Maythux 发布的帖子表明,您的第一个打开的 pts 将具有与显示管理器的登录相同的显示变量,在本例中为: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

这可能有助于了解伪终端的主从关系。

相关内容