Wohin geht die Ausgabe einer Anwendung, die vom Fenstermanager gestartet wurde?


10

Wenn Sie eine Anwendung von einem Terminal aus starten, können Sie die Ausgabe in stdout und stderr sehen. Wenn jedoch eine Anwendung über den Fenstermanager gestartet wird, wohin geht die Ausgabe in diese Dateien normalerweise? Nach / dev / null?


1
Vorschlag: Verwenden ps fauxSie diese Option, um zu überprüfen, welche tty / pts mit dem Prozess verknüpft sind. wenn keine oder "?" es geht wahrscheinlich in der Leere verloren. (Dies ist nur eine Idee, ich kann
mich

@Kwaio: Der Wert ist ein Fragezeichen (?), Also geht er, wie Sie sagen, wahrscheinlich in der Leere verloren.
August Karlstrom

2
Wenn Sie Ihre grafische Shell von gdm oder kdm gestartet haben, finden Sie die Ausgabe in~/.xsession-errors
Shadur

Antworten:


8

Die Ausgabe einer vom Fenstermanager gestarteten Anwendung erfolgt an derselben Stelle wie die Ausgabe vom Fenstermanager selbst. (Es sei denn, die Anwendung leitet sie um, typische GUI-Anwendungen jedoch nicht.)

Sie können herausfinden, wohin die Ausgabe des WM geht, indem Sie sich ansehen, was in Dateideskriptor 1 (Standardausgabe) und Dateideskriptor 2 (Standardfehler) geöffnet ist. Normalerweise werden beide in dieselbe Datei verschoben. Finden Sie die Prozess-ID Ihres Fenstermanagers heraus (versuchen Sie es z. B. pgrep metacityoder pidof metacitywenn Metacity Ihr Fenstermanager ist - wenn Sie den Prozessnamen für Ihren Fenstermanager nicht kennen, sehen Sie sich das Stammverzeichnis eines der von ps foder gemeldeten Prozessbäume an pstree). Angenommen, die Prozess-ID Ihres Fenstermanagers lautet 1234, führen Sie aus

lsof -p1234

und suchen Sie nach den Zeilen, die den Dateideskriptoren 1 und 2 entsprechen, oder

oder

ls -l /proc/1234/fd

Sie können die Filterung der relevanten Dateideskriptoren automatisieren:

lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]

(Hinweis: Alle oben genannten Befehle gelten für Linux. Sie pgrepsind bei anderen Unices üblich und lsofkönnen praktisch überall installiert werden. psOptionen und /procInhalte sind bei verschiedenen Unices unterschiedlich.)

In der allgemeinen Situation, in der Sie Befehle von einer Shell ausführen, die in einem Terminalemulator ausgeführt wird (xterm, konsole, gnome-terminal usw., jedoch nicht bei Verwendung über Bildschirm oder tmux), können Sie leicht überprüfen, wo die Ausgabe des Terminalemulators erfolgt wird ausgeführt, da der Terminalemulator der übergeordnete Prozess Ihrer Shell ist. Dies funktioniert nicht, wenn der Terminalemulator mit zusätzlichen Berechtigungen ausgeführt wird. Dies geschieht auf einigen Systemen, damit der Terminalemulator in die Liste der angemeldeten Benutzer (utmp) schreiben kann.

lsof -p$PPID
ls -l /proc/$PPID/fd

Viele Distributionen leiten die Ausgabe der X-Sitzung an ~/.xsession-errors.


In meinem Fall ist die Kind-Eltern-Hierarchie ab WM Blackbox <- lightdm <- lightdm <- init und alle ttys haben den Wert "?". Ich denke dann, dass die Ausgabe nirgendwo hingeht.
August Karlstrom

@AugustKarlstrom Dann pidof blackboxoder pgrep blackboxum die PID des Fenstermanagers zu erhalten, oder direkt lsof -p$(pidof blackbox). Ttys haben damit nichts zu tun.
Gilles 'SO - hör auf böse zu sein'

1
Ah natürlich. Der Befehl ls -l /proc/<blackbox-id>/fdsagt mir, dass stdout zu /dev/nullund stderr zu geht ~/.xsession-errors.
August Karlstrom

1

Der Fenstermanager ist das untergeordnete Element des X-Servers, sodass er und seine untergeordneten Ausgaben an derselben Stelle wie der X-Server gespeichert werden.

Wenn Sie der einzige Benutzer sind und sich grafisch anmelden, verschieben einige Systeme die X-Serverinstanz von der Ausgabekonsole, sodass Sie zu dieser VT wechseln und sie anzeigen können. Anekdotisch ist die Anordnung normalerweise alt-ctrl-f1die Ausgabekonsole für die X-Instanz und alt-ctrl-f7die X-Anzeige, aber Sie können so viele überprüfen, wie Sie finden können. Die ersten 6 erzeugen normalerweise Anmeldungen, aber es gibt möglicherweise mehr, die nicht leer sind und leer oder mit Pipeline-Ausgabe erscheinen. Bei einigen von ihnen wird möglicherweise eine Ausgabe von init ausgegeben. Verwechseln Sie dies nicht mit der Ausgabe von X. Nach meiner Erfahrung bellen X und Kinder immer eine erhebliche Anzahl von Warnungen und Meldungen (über fehlende Schriftarten, veraltete Anrufe usw.).

Wenn Sie sich nicht über eine GUI anmelden, ist dies die VT, von der aus Sie X gestartet haben. Dies ist ein Problem, da Sie dies erst sehen, wenn Sie das Programm beenden. Ich glaube, mit einem GUI-Login wird XDM (das grafische Login) als privilegierter Prozess ausgeführt, was bedeutet, dass es die Ausgabe an weiterleiten kann /dev/tty7. Sie können auch ( startx 1>&2> /dev/tty7), wenn Sie über die richtigen Superuser-Berechtigungen verfügen.


1
Im Falle startxoder xinitdirekt kann man jederzeit Anpassungen vornehmen ~/.xinitrc, um Umleitungen nach Bedarf durchzuführen , bevor der execgewünschte Fenstermanager ausgeführt wird. Ich selbst habe diese Art von Ausgabe nie verpasst. Wenn ich interessiert bin, welche GUI-Anwendung produziert, führe ich sie vom Terminal aus. Aber eigentlich könnte es hilfreich sein, also habe ich stdout und stderr von ~/.xinitrcan umgeleitet ~/.xinitrc.out.
Miroslav Koškár

0

Wenn Sie davon ausgehen, dass ein Programm normalerweise ein anderes Programm durch Ausführen einer Reihe von man 2 forkund man 2 execvedann in diesem Prozess standardmäßig geöffnet bleibt, bleiben die Dateideskriptoren geöffnet.

Die Antwort lautet also, dass die Ausgabe / der Fehler normalerweise dahin geht, wo die Prozessausgabe / der Fehler des übergeordneten Elements auf die Gabelzeit zeigte (es sei denn, das übergeordnete Programm führt natürlich einige Umleitungen durch). Ich denke, Sie können nichts Spezifischeres behaupten, wenn wir den Namen des übergeordneten Programms nicht genau kennen. Der Window Manager-Prozess ist selten daran beteiligt, andere Programme direkt zu starten.

Zum Beispiel in meinem Fall

  • Durch Drücken von Strg + P (vom xmonadFenstermanager behandelt) wird gestartetdmenu_run
  • dmenu_runwird meine Eingabe verarbeiten und eine Anwendung starten (z. B. xkill)

Die Ausgabe geht an /dev/tty1weil

  • xkill wurde von gestartet dmenu_run
  • dmenu_run wurde von gestartet xmonad
  • xmonad wurde von gestartet X
  • X wurde von gestartet startx
  • startx wurde von mir manuell von der ersten virtuellen Konsole aus gestartet /dev/tty1

Nur als Referenz, wenn Sie herausfinden möchten, wohin die Ausgabe / der Fehler führt, oder besser sagen möchten, welche Dateideskriptoren für einen bestimmten Prozess (mit bekannter PID) geöffnet sind, tun Sie dies

$ lsof -p PID
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.