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


8

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

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

Answers:


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)

1
不错的解决方案。您能为幕后发生的事情添加一些解释吗?另外,输出是crott,如何获取完整的进程名称?
Danatela 2014年

1
此命令在/ proc目录中递归搜索。DISPLAY每个文件中的grep 。这些文件实际上是在运行的进程中,因此每个包含单词的文件都DISPLAY意味着该进程正在使用它。您无法获得完整的进程名称,因为输出中的名称是基于ion创建的文件名,/proc因此您所提供的信息不多。
Maythux 2014年

1
请租用,而是编辑答案,并仅通知用户您已更新您的帖子。
Braiam

我弄乱了DISPLAY env变量,并想知道在更改它之前DISPLAY的值是什么,我不知道有什么逗号可以告诉我它的历史,因此通过使用此命令,我发现了哪个较早的进程使用了哪个DISPLAY值,问题就解决了。
yaxe

1

稍稍修改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)

0

多数民众赞成在一些漂亮的命令行脚本!我要在那个脚本上复制一个副本,以防万一我不得不破解它以找出其他东西。

理想情况下,登录后与您在本地计算机上执行的程序相对应的所有当前进程,都将具有与第一个打开的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)

如果在shell的登录后执行中将DISPLAY变量设置为不同(例如:0.0),则使用灯光显示管理器,则DISPLAY的环境变量将产生与第一个打开的pts的登录后显示变量相同的显示变量(: 0.0),但登录时的主机变量仍为(:0)。

通过回显DISPLAY变量,或运行管道传递给less,如下所示:

:~$ echo $DISPLAY

要么

:~$ set | less

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

您发布的脚本的输出表明您的第一个打开的点将具有与显示管理器的登录名相同的显示变量,在这种情况下为: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

这可能使您对伪终端的主从关系有所了解。

我希望这有帮助!

您还从哪里获得该脚本的?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.