Si vous démarrez une application à partir d'un terminal, vous pouvez voir la sortie vers stdout et stderr, mais si une application est démarrée depuis le gestionnaire de fenêtres, où va généralement la sortie vers ces fichiers? À / dev / null?
10
ps faux
pour vérifier quels tty / pts sont associés au processus. si aucun ou "?" il se perd probablement dans le vide. (ce n'est qu'une idée, je peux me tromper)~/.xsession-errors
Réponses:
La sortie d'une application démarrée à partir du gestionnaire de fenêtres va au même endroit que la sortie du gestionnaire de fenêtres lui-même. (À moins que l'application ne le redirige, mais pas les applications GUI typiques.)
Vous pouvez savoir où va la sortie du WM en regardant ce qu'il a ouvert sur le descripteur de fichier 1 (sortie standard) et le descripteur de fichier 2 (erreur standard); généralement, les deux iront dans le même fichier. Découvrez l'ID de processus de votre gestionnaire de fenêtres (essayez par exemple
pgrep metacity
oupidof metacity
si Metacity est votre gestionnaire de fenêtres - si vous ne connaissez pas le nom du processus pour votre gestionnaire de fenêtres, regardez la racine de l'un des arbres de processus signalés parps f
oupstree
). Supposons que l'ID de processus de votre gestionnaire de fenêtres soit 1234, exécutezet recherchez les lignes correspondant aux descripteurs de fichiers 1 et 2, ou
ou
Vous pouvez automatiser le filtrage des descripteurs de fichiers appropriés:
(Remarque: toutes les commandes ci-dessus sont pour Linux.
pgrep
Est commune à d'autres unités, etlsof
peut être installée à peu près n'importe où; lesps
options et le/proc
contenu sont différents selon les différents unités.)Dans la situation courante où vous exécutez des commandes à partir d'un shell exécuté dans un émulateur de terminal (xterm, konsole, gnome-terminal, etc., mais pas lorsqu'il est utilisé sur l'écran ou tmux), vous pouvez facilement vérifier où la sortie de l'émulateur de terminal va, car l'émulateur de terminal est le processus parent de votre shell. Cela ne fonctionne pas si l'émulateur de terminal s'exécute avec des privilèges supplémentaires, ce qui se produit sur certains systèmes pour permettre à l'émulateur de terminal d'écrire dans la liste des utilisateurs connectés (utmp).
De nombreuses distributions dirigent la sortie de la session X vers
~/.xsession-errors
.la source
pidof blackbox
oupgrep blackbox
pour obtenir le PID du gestionnaire de fenêtres, ou directementlsof -p$(pidof blackbox)
. Ttys n'a rien à voir avec ça.ls -l /proc/<blackbox-id>/fd
me dit que stdout va à/dev/null
et stderr va à~/.xsession-errors
.Le gestionnaire de fenêtres est l'enfant du serveur X, donc lui et la sortie de ses enfants vont au même endroit que le serveur X.
Si vous êtes le seul utilisateur et que vous vous connectez graphiquement, certains systèmes déplacent l'instance de serveur X de la console de sortie, ce qui signifie que vous pouvez basculer vers ce VT et le voir. Pour l'anecdote, l'arrangement est généralement
alt-ctrl-f1
la console de sortie de l'instance X etalt-ctrl-f7
l'affichage X, mais vous pouvez en vérifier autant que vous le pouvez. Les 6 premiers génèrent généralement des connexions, mais il y en a potentiellement plus qui n'apparaissent pas et apparaîtront vides ou avec une sortie canalisée. Il peut y avoir une sortie sur certains d'entre eux depuis init, ne confondez pas cela avec la sortie de X. D'après mon expérience, X et les enfants aboient toujours une quantité importante d'avertissements et de messages (sur les polices manquantes, les appels dépréciés, etc.).Si vous ne vous connectez pas via une interface graphique, ce sera le VT à partir duquel vous avez démarré X, ce qui est un problème car vous ne le verrez pas jusqu'à ce que vous quittiez. Je crois qu'avec une connexion GUI, XDM (la connexion graphique) fonctionne comme un processus privilégié, ce qui signifie qu'il peut diriger la sortie vers
/dev/tty7
. Vous pouvez aussi (startx 1>&2> /dev/tty7
) si vous disposez des privilèges de superutilisateur appropriés.la source
startx
ouxinit
directement, on peut toujours modifier~/.xinitrc
pour faire des redirections au besoin avant de faireexec
sur le gestionnaire de fenêtres souhaité. Moi, je n'ai jamais raté ce genre de sortie. Si je suis intéressé par l'application que GUI produit, je l'exécute à partir du terminal. Mais en fait, cela pourrait être utile, j'ai donc redirigé stdout et stderr~/.xinitrc
vers~/.xinitrc.out
.Si vous prenez ce généralement un programme démarre une autre en faisant de série
man 2 fork
etman 2 execve
puis dans ce processus par des descripteurs de fichiers par défaut restent ouverts.Donc, la réponse est que, généralement, la sortie / l'erreur va là où la sortie / l'erreur du processus parent pointait au moment de la fourche (à moins que le programme parent ne fasse des redirections bien sûr). Je pense que vous ne pouvez pas prétendre à quelque chose de plus spécifique à moins que nous connaissions exactement le nom du programme parent. Le processus du gestionnaire de fenêtres est rarement impliqué dans le lancement direct d'autres programmes.
Par exemple dans mon cas
xmonad
gestionnaire de fenêtres) démarreradmenu_run
dmenu_run
va gérer mon entrée et démarrer une application (par exemple.xkill
)La sortie ira à
/dev/tty1
parce quexkill
a été lancé pardmenu_run
dmenu_run
a été lancé parxmonad
xmonad
a été lancé parX
X
a été lancé parstartx
startx
a été démarré manuellement par moi à partir de la première console virtuelle/dev/tty1
Juste pour référence, si vous voulez trouver où va la sortie / l'erreur, ou mieux dire quels sont les descripteurs de fichiers ouverts pour un processus particulier (avec un PID connu), faites
la source