どのプロセスがDISPLAY変数が設定されているかを知る方法は?


8

時々私は表示でいくつかの問題に直面し、ほとんどの場合、どのファイルまたはプロセスがDISPLAY環境変数を使用しているのか知りたいです。

では、DISPLAYが設定されているすべてのプロセスを一覧表示するにはどうすればよいでしょうか。

回答:


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
素晴らしい解決策。舞台裏で何が起きているのか説明を追加していただけませんか?また、出力はトリミングされていますが、完全なプロセス名を取得するにはどうすればよいですか?
Danatela 2014年

1
このコマンドは、/ procディレクトリを再帰的に検索します。DISPLAY各ファイルのgrep 。それらのファイルは実際には実行中のプロセスにあるため、単語を含むすべてのファイルDISPLAYは、このプロセスがそれを使用していることを意味します。出力内の名前は、作成されたファイル名であるため、完全なプロセス名を取得することはできません。その/procため、提供されている以上のものを知ることはできません。
Maythux 2014年

1
代わりに、回答を編集して、投稿を更新したことをユーザーに通知してください。
Braiam

私はDISPLAY環境変数をめちゃくちゃにしていて、変更する前に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)

シェルのログイン後の実行に対してDISPLAY変数が異なるように設定されている場合(たとえば:0.0)、ライトディスプレイマネージャーを使用すると、DISPLAYの環境変数は、最初に開いたptsのログイン後のディスプレイ変数と同じディスプレイ変数を生成します(: 0.0)、ただし、ログイン時のホスト変数は(:0)のままです。

DISPLAY変数をエコーするか、次のようにsetをlessにパイプして実行します。

:~$ echo $DISPLAY

または

:~$ set | less

シェルのログイン後の実行について、セッションの現在の表示変数をチェックして、それが何に設定されているかを確認することもできます。したがって、基本的には、実行するプロセスの表示変数は、ログイン後に最初に開いたポイントと同じ表示変数になります。

投稿したスクリプトの出力は、最初に開いたptsがディスプレイマネージャーのログインと同じ表示変数(この場合は:0)を持つことを示唆しています。

2番目の例では、出力は次のようになります。

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

これは、疑似端末のマスターとスレーブの関係を理解するのに役立ちます。

これが役に立てば幸いです!

また、そのスクリプトはどこで入手しましたか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.