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

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

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

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

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脚本的小修改,我们还可以使用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) 

这是一些非常漂亮的命令行脚本! 我会在那个剧本上复制一份,以防万一我不得不破解其他东西。

理想情况下,与您在本地计算机上执行的程序相对应的所有当前进程(登录后)将携带与第一个打开的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变量,或运行set piped to less,如下所示:

 :~$ echo $DISPLAY 

要么

 :~$ set | less 

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

您发布的脚本的输出表明您的第一个打开的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 

这可能会让您深入了解伪终端的主从关系。

我希望这有帮助!

你在哪里得到那个剧本?