ここでの質問を、プロセスをグラフィカルにリストする方法と混同しないでください。それは私が求めていることではありません。
ターミナルで、どのプロセスにGUIがあるかを確認するにはどうすればよいですか? Firefox、vlc、geany、nautilusなどのように...すべてにGUIがあります。どのプロセスがウィンドウマネージャーのリソースを使用しているかについて詳しく知りたいのですが、ターミナルからそれを実行したいと思います。
これらのタイプのプロセスに関する詳細情報を取得するにはどうすればよいですか?
私はps
コマンドを使おうとしていますが、これを解決するのに役立つターミナルコマンドをおもてなしします。
更新:pstree
に気に入ったものがあります。これは、関心のあるすべてのグラフィカルプロセスが生成されるツリーです。
$ pstree init─┬─ │ ├─lightdm─┬─Xorg │├─lightdm─┬ ─init─┬─ │││├─firefox───55* [{firefox}] │││├─geany─┬─bash ││││ │││├─gnome-terminal─┬─bash───pstree
xrestop
またはxrestop -b
を試してください。
これは、各Xウィンドウが消費するXリソースの数を測定することを目的としていますが、小さなボーナスとして、ウィンドウの名前と対応するPIDを識別します。
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
は私の投票を得ます。
または、 [〜#〜] ewmh [〜#〜] 互換性のあるウィンドウマネージャーを使用している場合は、wmctrl
を試してみてください。すべてのwindows being managed by the window manager
+それらのPIDをリストできます。
$ wmctrl -lp | awk '{ print $3 }' | sort | uniq
15672
19685
19925
26247
6884
ええ、これにはXが必要です。しかし、私はこれをすぐに実行できるツールを知りません。
GUIを備えたアプリは、ローカルXサーバー上のクライアントです。ただし、ローカルXサーバー上のクライアントは、必ずしもGUIを備えたアプリであるとは限りません。また、ローカルXサーバー上のクライアントは必ずしもローカルプロセスである必要はなく、GUIを使用するローカルプロセスはリモートXサーバー上のクライアントである可能性があります。
xlsclients
またはxlsclients -a
に近づくと思います。 -l
オプションを使用すると、(とりわけ)ウィンドウIDも提供されます。しかし、それはあなたにPIDを与えることはできません。 Xは一般的にそれを知りません。
熟考:ルートアクセスを使用すると、lsof
出力をgrepして、どの(ローカル!)プロセスが(ローカル!)Xサーバーにアクセスするかを確認できます。それで、おそらくすでにこれを行っているいくつかのツールがありますか?知りません。