Woher wissen, für welche Prozesse die Variable DISPLAY festgelegt ist?


8

Manchmal habe ich Probleme mit der Anzeige und meistens möchte ich wissen, welche Dateien oder Prozesse die Umgebungsvariable DISPLAY verwenden.

Wie liste ich alle Prozesse auf, für die DISPLAY eingestellt ist?

Antworten:


13

Ich bin nach vielen Suchen und Versuchen auf diesen Befehl gekommen:

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/'

Ein Beispiel für die Ausgabe ist:

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
Schöne Lösung. Könnten Sie bitte eine Erklärung hinzufügen, was hinter den Kulissen passiert? Außerdem wird die Ausgabe abgeschnitten. Was kann ich tun, um vollständige Prozessnamen zu erhalten?
Danatela

1
Dieser Befehl sucht rekursiv im Verzeichnis / proc. grep für die DISPLAYin jeder Datei. Diese Dateien befinden sich tatsächlich in den Prozessen, die ausgeführt werden. Jede Datei, die das Wort enthält, DISPLAYbedeutet, dass dieser Prozess es verwendet. Sie können nicht den vollständigen Prozessnamen abrufen, da die Namen in der Ausgabe die Dateinamen sind, die gegründet wurden. /procSie können also einfach nicht mehr als die angebotenen wissen.
Maythux

1
Bitte bearbeiten Sie stattdessen Ihre Antwort und informieren Sie den Benutzer, dass Sie Ihren Beitrag aktualisiert haben.
Braiam

Ich hatte die Variable DISPLAY env durcheinander gebracht und wollte wissen, welche Werte DISPLAY hatte, bevor ich sie änderte. Ich kenne kein Kommando, das mir etwas über den Verlauf erzählen könnte. Mit diesem Befehl fand ich heraus, welche früheren Prozesse vorhanden waren verwendet, welcher DISPLAY-Wert und mein Problem gelöst wurde.
Yaxe

1

Mit einer kleinen Änderung am Maythux-Skript können wir auch die PID der Prozesse mithilfe der DISPLAY-Variablen abrufen.

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

Die Ausgabe ist:

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

Das ist ein ziemlich geschicktes Kommandozeilen-Scripting! Ich werde eine Kopie dieses Skripts erstellen, falls ich es hacken muss, um etwas anderes herauszufinden.

Im Idealfall enthalten alle aktuellen Prozesse, die den Programmen entsprechen, die Sie nach dem Anmelden auf dem lokalen Computer ausführen, dieselbe Anzeigevariable wie Ihre erste offene pts-Konsole (Pseudo-Terminal-Sitzung).

Wenn Sie beispielsweise Ihre erste Terminalsitzung (gnome-terminal) öffnen und den Befehl who oder w ausführen, werden Sie eine Ausgabe wie die folgende bemerken:

$ who

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0)

oder einige Leute könnten so aussehen (aber nicht Ihr Fall)

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0.0)

Wenn bei Verwendung des Lichtanzeigemanagers die Variable DISPLAY für die Ausführung von Shells nach der Anmeldung anders eingestellt ist (z. B. 0.0), ergibt die Umgebungsvariable für DISPLAY dieselbe Anzeigevariable wie die Anzeigevariable nach der Anmeldung der ersten geöffneten Punkte (: 0.0), aber die Hostvariable bei der Anmeldung wäre immer noch (: 0).

Durch Echo der DISPLAY-Variablen oder durch Ausführen von set auf weniger wie unten gezeigt:

:~$ echo $DISPLAY

oder

:~$ set | less

Sie können auch die aktuelle Anzeigevariable Ihrer Sitzung überprüfen und sehen, auf welche sie eingestellt ist, um Shells nach der Anmeldung auszuführen. Im Grunde genommen hat die Anzeigevariable der Prozesse, die Sie ausführen, dieselbe Anzeigevariable wie Ihre ersten offenen Punkte nach der Anmeldung.

Die Ausgabe des Skripts, das Sie veröffentlicht haben, deutet darauf hin, dass Ihre ersten geöffneten Punkte dieselbe Anzeigevariable haben wie das Login Ihres Anzeigemanagers, in diesem Fall: 0.

Für das zweite Beispiel würde die Ausgabe ungefähr so ​​aussehen:

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)

Weitere Informationen finden Sie in den Manpages zu ptmx

$ man ptmx

Dies könnte Ihnen einen Einblick in die Master-Slave-Beziehung von Pseudo-Terminals geben.

Ich hoffe das hilft!

Auch woher hast du das Drehbuch?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.