web-dev-qa-db-ja.com

ターミナルからグラフィカルプロセスを一覧表示

ここでの質問を、プロセスをグラフィカルにリストする方法と混同しないでください。それは私が求めていることではありません。

ターミナルで、どのプロセスにGUIがあるかを確認するにはどうすればよいですか? Firefox、vlc、geany、nautilusなどのように...すべてにGUIがあります。どのプロセスがウィンドウマネージャーのリソースを使用しているかについて詳しく知りたいのですが、ターミナルからそれを実行したいと思います。

これらのタイプのプロセスに関する詳細情報を取得するにはどうすればよいですか?

私はpsコマンドを使おうとしていますが、これを解決するのに役立つターミナルコマンドをおもてなしします。

更新:pstreeに気に入ったものがあります。これは、関心のあるすべてのグラフィカルプロセスが生成されるツリーです。

 
 $ pstree 
init─┬─
│
├─lightdm─┬─Xorg
│├─lightdm─┬ ─init─┬─
│││├─firefox───55* [{firefox}] 
│││├─geany─┬─bash
││││ 
│││├─gnome-terminal─┬─bash───pstree
 
 
7
j0h

xrestopまたはxrestop -bを試してください。

これは、各Xウィンドウが消費するXリソースの数を測定することを目的としていますが、小さなボーナスとして、ウィンドウの名前と対応するPIDを識別します。

6
myaut

xlsclientsは近くにあり(そしてXの標準部分)、Xサーバーのクライアントを一覧表示します。 しかし、あなたが「アプリケーション」と見なすものとXが「クライアント」と見なすものとの間に1:1のマッピングがない場合があります。たとえば、LyXの単一の実行インスタンスは13のクライアントを消費します。たとえば、_xlsclients -l_(長い形式の出力)を使用すると、「アイコン名」が定義されているのはそのうちの1つだけですが、これはヒントにすぎません。また、XQueryTree()を使用しているため、一部のウィンドウが見つからない可能性があります(開いているxpdfウィンドウが見つかりません)。

また、あまり情報が得られませんが、_xlsclients -l_を使用してウィンドウIDを取得し、各ウィンドウに_xprop -id $ID_でクエリを実行することもできます。ウィンドウの詳細については、xwinifoを使用してください。ただし、クライアントやアプリケーションと同じものではない「ウィンドウ」を考慮します。

_xwininfo -root -children
xwininfo -root -tree  # indented view
_

ウィンドウマネージャーによっては、特定のウィンドウプロパティ(例:__NET_xxx_または__NET_WM_xxxx_ properties )を調べて、何かが「アプリケーション」であるかどうかを判断できる場合があります。の場合 ウィンドウマネージャー クライアントまたはGUIライブラリがそれを設定します(現代的なものであれば)__NET_WM_PID_プロパティは、PIDを特定のウィンドウに関連付ける最も簡単な( 不完全ですが )方法です。これらすべての要素を結び付けるツールを私は知りません。

私はウィンドウマネージャーFVWMを使用していますが、FvwmCommandを使用して直接話すことができます。 _FvwmCommand -i1 send_windowlist_はウィンドウのリストを表示します。 @Arkadiuszの使用提案 wmctrl は、同じことを行うためのウィンドウマネージャーにとらわれない良い方法のようです。

もう1つのトリックは、ルートウィンドウの __WIN_CLIENT_LIST_bash経由でクエリすることです。

_$ xwininfo -root 
xwininfo: Window id: 0x69 (the root window) (has no name)
[..]

$ IFS=",= " read -a win < <(xprop -notype -id 0x69 32x  _WIN_CLIENT_LIST )

$ for ((ww=1; ww<${#win[*]}; ww++)); do 
    printf "%i %s\n" $ww ${win[$ww]};  
    xprop -id ${win[ww]} -notype _NET_WM_PID WM_NAME WM_CLASS \
                                 WM_ICON_NAME WM_CLIENT_LEADER; 
  done
_

これは、WMがウィンドウとしてリストしているものと完全に一致します(WMウィンドウリストから除外するように構成したものはありません)。子ウィンドウは_WM_CLIENT_LEADER_を親に設定します( セッション管理 の場合)。ただし、親ウィンドウは表示されない場合があり(Firefoxがこれを行います)、それ自体を指す場合があります。

xrestopは私の投票を得ます。

6
mr.spuratic

または、 [〜#〜] ewmh [〜#〜] 互換性のあるウィンドウマネージャーを使用している場合は、wmctrlを試してみてください。すべてのwindows being managed by the window manager +それらのPIDをリストできます。

$ wmctrl  -lp | awk  '{ print $3 }' | sort | uniq
15672
19685
19925
26247
6884
4

ええ、これにはXが必要です。しかし、私はこれをすぐに実行できるツールを知りません。

GUIを備えたアプリは、ローカルXサーバー上のクライアントです。ただし、ローカルXサーバー上のクライアントは、必ずしもGUIを備えたアプリであるとは限りません。また、ローカルXサーバー上のクライアントは必ずしもローカルプロセスである必要はなく、GUIを使用するローカルプロセスはリモートXサーバー上のクライアントである可能性があります。

xlsclientsまたはxlsclients -aに近づくと思います。 -lオプションを使用すると、(とりわけ)ウィンドウIDも提供されます。しかし、それはあなたにPIDを与えることはできません。 Xは一般的にそれを知りません。

熟考:ルートアクセスを使用すると、lsof出力をgrepして、どの(ローカル!)プロセスが(ローカル!)Xサーバーにアクセスするかを確認できます。それで、おそらくすでにこれを行っているいくつかのツールがありますか?知りません。

2
The Sidhekin