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?
10
ps faux
Sie 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~/.xsession-errors
Antworten:
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 metacity
oderpidof metacity
wenn Metacity Ihr Fenstermanager ist - wenn Sie den Prozessnamen für Ihren Fenstermanager nicht kennen, sehen Sie sich das Stammverzeichnis eines der vonps f
oder gemeldeten Prozessbäume anpstree
). Angenommen, die Prozess-ID Ihres Fenstermanagers lautet 1234, führen Sie ausund suchen Sie nach den Zeilen, die den Dateideskriptoren 1 und 2 entsprechen, oder
oder
Sie können die Filterung der relevanten Dateideskriptoren automatisieren:
(Hinweis: Alle oben genannten Befehle gelten für Linux. Sie
pgrep
sind bei anderen Unices üblich undlsof
können praktisch überall installiert werden.ps
Optionen und/proc
Inhalte 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.
Viele Distributionen leiten die Ausgabe der X-Sitzung an
~/.xsession-errors
.quelle
pidof blackbox
oderpgrep blackbox
um die PID des Fenstermanagers zu erhalten, oder direktlsof -p$(pidof blackbox)
. Ttys haben damit nichts zu tun.ls -l /proc/<blackbox-id>/fd
sagt mir, dass stdout zu/dev/null
und stderr zu geht~/.xsession-errors
.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-f1
die Ausgabekonsole für die X-Instanz undalt-ctrl-f7
die 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.quelle
startx
oderxinit
direkt kann man jederzeit Anpassungen vornehmen~/.xinitrc
, um Umleitungen nach Bedarf durchzuführen , bevor derexec
gewü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~/.xinitrc
an umgeleitet~/.xinitrc.out
.Wenn Sie davon ausgehen, dass ein Programm normalerweise ein anderes Programm durch Ausführen einer Reihe von
man 2 fork
undman 2 execve
dann 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
xmonad
Fenstermanager behandelt) wird gestartetdmenu_run
dmenu_run
wird meine Eingabe verarbeiten und eine Anwendung starten (z. B.xkill
)Die Ausgabe geht an
/dev/tty1
weilxkill
wurde von gestartetdmenu_run
dmenu_run
wurde von gestartetxmonad
xmonad
wurde von gestartetX
X
wurde von gestartetstartx
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
quelle