回答:
私は多くの検索と試行の後にこのコマンドを思いつきました:
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
各ファイルのgrep 。それらのファイルは実際には実行中のプロセスにあるため、単語を含むすべてのファイルDISPLAY
は、このプロセスがそれを使用していることを意味します。出力内の名前は、作成されたファイル名であるため、完全なプロセス名を取得することはできません。その/proc
ため、提供されている以上のものを知ることはできません。
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)
シェルのログイン後の実行に対して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
これは、疑似端末のマスターとスレーブの関係を理解するのに役立ちます。
これが役に立てば幸いです!
また、そのスクリプトはどこで入手しましたか?