Listen Sie grafische Prozesse vom Terminal aus auf

7

Verwechseln Sie die Frage hier nicht mit der grafischen Auflistung von Prozessen, das ist nicht das, was ich frage.

Wie kann ich im Terminal sehen, welche Prozesse eine GUI haben? wie in Sachen wie Firefox, VLC, Geany, Nautilus etc ... haben alle eine GUI. Ich möchte weitere Informationen darüber, welche Prozesse Windows Manager-Ressourcen verwenden, und ich möchte dies vom Terminal aus tun.

Wie erhalte ich weitere Informationen zu DIESEN Prozesstypen?

Ich habe versucht, den psBefehl zu verwenden, aber ich würde jeden Terminalbefehl unterhalten, um dieses Problem zu lösen.

UPDATE: Ich sehe etwas, das mir gefällt pstree , nämlich den Baum, aus dem alle grafischen Prozesse hervorgehen, die mich interessieren:

$ pstree
init─┬─
     │
     ├─lightdm─┬─Xorg
     │ ├ lightdm─┬─init─┬─
     │ │ │ ├ Firefox───55 * [{Firefox}]
     │ │ │ ├ggeany─┬─bash
     │ │ │ │       
     │ │ │ ├gnome-terminal─┬─bash───pstree


j0h
quelle
Vielleicht mit pstree
jcbermu
1
Was genau meinen Sie mit "eine grafische Benutzeroberfläche haben"? Zum Beispiel sind xterm oder gnome-terminal X-Clients, die X-Ressourcen verwenden und von Ihrem Fenstermanager verwaltet werden, aber es ist schwer zu argumentieren, dass sie tatsächlich GUIs haben.
Jamesqf
Stellen Sie sich vor, Sie drücken Alt + Tab. Eine kleine Liste von Anwendungen wird angezeigt. Es handelt sich um grafische Anwendungen. Es handelt sich nicht um Panel-Applets. Ich suche nach einer programmatischen Methode zur Identifizierung dieser Anwendungen zur Verwendung in Shell-Skripten. Es gibt andere Programme, die als Prozesse ausgeführt werden. Ich suche nach einer Möglichkeit, die Fensterkomponente einer Anwendung mit einem Shell-Skript zu identifizieren. An diesem Punkt scheint die Fenster-ID die beste Wahl zu sein. Ich
regiere
Um genau zu sein, haben einige Prozesse möglicherweise eine GUI, die auf einem anderen X-Display angezeigt wird, wie z. B. ein anderer Computer über das Netzwerk. Wenn eine leichte X-Terminal-Hardware verwendet wird, wird für alle Programme die GUI auf einem anderen Computer angezeigt. (Wenn Sie nach Programmen suchen, die eine GUI auf dem aktuellen X-Display haben, wird dies behoben und das getan, was Sie höchstwahrscheinlich meinen. Das X-Display muss im Terminal ($ DISPLAY, häufig: 0.0) dafür bekannt sein, was schwierig sein kann in einem Cron Job oder so.)
Volker Siegel

Antworten:

6

Versuchen Sie es xrestopoder xrestop -b.

Es ist beabsichtigt zu messen, wie viele X-Ressourcen jedes X-Fenster verbraucht, aber als kleiner Bonus werden der Name der Fenster und die entsprechenden PIDs identifiziert.

myaut
quelle
Es ist so nah dran, cool zu sein. Aber es gibt mir auch eine Idee, dass die Informationen, die ich möchte, Teil von X
j0h
3
@ j0h Nun ... versuche zu definieren, was es bedeutet, "eine GUI zu haben". Am Ende bedeutet dies, dass der Prozess einige Befehle an den GUI-Server des Betriebssystems sendet, um einige Fenster anzuzeigen. X ist der Anzeigeserver für Linux-Systeme, daher "verwenden" alle Prozesse mit einer GUI irgendwie X. Es gibt wirklich keinen wirklichen Unterschied zwischen GUI- und Nicht-GUI-Prozessen aus Sicht des Kernels, und als solche gibt es keinen Einfacher Systemaufruf, um festzustellen, ob ein Prozess über eine GUI verfügt oder nicht.
Bakuriu
6

xlsclientsist nah (und ein Standardteil von X), listet es die Clients des X-Servers auf. Aber könnte es nicht sein , eine 1: 1 - Zuordnung zwischen dem, was man bedenkt , eine „Anwendung“ und was X betrachtet einen „Client“. Meine einzelne laufende Instanz von LyX verbraucht beispielsweise 13 Clients. Wenn ich xlsclients -l(Langformausgabe) verwende, kann ich sehen, dass nur einer von ihnen einen definierten "Symbolnamen" hat, dies ist jedoch nur ein Hinweis. Da es verwendet wird XQueryTree(), fehlen möglicherweise einige Fenster (es werden keine xpdfFenster gefunden, die ich geöffnet habe).

Es gibt auch nicht sehr viele Informationen. Sie können jedoch xlsclients -ldie Fenster-ID abrufen und jedes Fenster mit abfragen xprop -id $ID. Verwenden xwinifoSie für weitere Details zu einem Fenster, obwohl es sich um "Fenster" handelt, die nicht mit Clients oder Anwendungen identisch sind:

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

Abhängig von Ihrem Fenstermanager können Sie möglicherweise bestimmte Fenstereigenschaften (z. B. _NET_xxxoder _NET_WM_xxxx Eigenschaften ) überprüfen, um festzustellen, ob es sich um eine "Anwendung" handelt. Wenn der Fenstermanager- Client oder die GUI-Bibliothek dies festlegt (was auch immer zeitgemäß sein sollte), ist die _NET_WM_PIDEigenschaft die einfachste ( wenn auch unvollständige ) Möglichkeit, eine PID einem bestimmten Fenster zuzuordnen. Ich kenne kein Werkzeug, das all diese Teile zusammenhält.

Ich benutze den Fenstermanager FVWM, ich kann direkt mit ihm sprechen FvwmCommand, zB FvwmCommand -i1 send_windowlistzeigt mir die Liste der Fenster. @Arkadiusz 'Vorschlag zur Verwendung wmctrlscheint eine gute und Fenstermanager-agnostische Methode zu sein, um dasselbe zu tun.

Ein weiterer Trick besteht darin, die Stammfenster abzufragen _WIN_CLIENT_LISTüber 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

Dies entspricht genau dem, was meine WM als Fenster auflistet (ohne die, die ich so konfiguriert habe, dass sie von der WM-Fensterliste ausgeschlossen werden). Untergeordnete Fenster werden WM_CLIENT_LEADERauf das übergeordnete Fenster festgelegt (für die Sitzungsverwaltung ), obwohl das übergeordnete Fenster möglicherweise nicht sichtbar ist (Firefox führt dies aus) und möglicherweise auf sich selbst verweist.

xrestop bekommt aber meine Stimme.

mr.spuratic
quelle
4

Wenn Sie einen EWMH- kompatiblen Fenstermanager verwenden, können Sie es auch wmctrlversuchen. Es kann alle windows being managed by the window manager+ ihre PIDs auflisten:

$ wmctrl  -lp | awk  '{ print $3 }' | sort | uniq
15672
19685
19925
26247
6884
Arkadiusz Drabczyk
quelle
2

Ja, dafür brauchst du X. Aber ich kenne kein Tool, das dies sofort erledigt.

Eine App mit einer GUI ist ein Client auf dem lokalen X-Server. Ein Client auf dem lokalen X-Server ist jedoch nicht unbedingt eine App mit einer grafischen Benutzeroberfläche. Außerdem ist ein Client auf dem lokalen X-Server nicht unbedingt ein lokaler Prozess, und ein lokaler Prozess mit einer GUI kann durchaus ein Client auf einem Remote-X-Server sein.

Ich denke du kommst mit xlsclientsoder näher xlsclients -a. Mit der -lOption erhalten Sie (unter anderem) auch die Fenster-ID. Aber es kann Ihnen nicht die PID geben. X weiß es im Allgemeinen nicht.

Nachdenken: Mit Root-Zugriff können Sie die lsofAusgabe durchsuchen, um festzustellen, welche (lokalen!) Prozesse auf die (lokalen!) X-Server zugreifen. Vielleicht gibt es da draußen schon ein Tool, das das macht? Ich weiß es nicht.

Der Sidhekin
quelle
Dies hat wahrscheinlich nichts damit zu tun, aber wie funktioniert Alt + Tab?
11.
@ j0h Um zwischen Windows zu wechseln? Das würde der Fenstermanager erledigen. Wenn Sie nicht irgendwie ohne Fenstermanager arbeiten, lassen Sie dies einfach vom Fenstermanager tun. Wenn Sie Alt + Tab über ein Skript ausführen möchten, lesen Sie, wie Sie Ihren Fenstermanager (ich glaube nicht, dass Sie uns mitgeteilt haben, welchen Sie verwenden?) Über ein Skript steuern können.
Die Sidhekin
lsofkann Unix- oder abstrakte Domain-Sockets auflisten, aber nicht sagen, mit was sie verbunden sind.
Stéphane Chazelas
@ StéphaneChazelas Mein schlechtes. Ich dachte, es wäre möglich, etwas wie NODE oder DEVICE (Adresse) zuzuordnen, um zu sehen, welche beiden Enden verbunden sind. Ist es nicht.
Die Sidhekin
1
Mit diesem perlSkript können Sie unter Linux sudo lsof -aUc Xorg | sudo that-scriptdie lokalen Clients mithilfe der Unix- / Abstract-Sockets auflisten. sudo lsof -ai tcp -c Xorgum die Clients mit TCP-Sockets aufzulisten.
Stéphane Chazelas