Où va la sortie d'une application démarrée depuis le gestionnaire de fenêtres?

10

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?

August Karlstrom
la source
1
Suggestion: utilisez ps fauxpour 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)
mveroone
@Kwaio: La valeur est un point d'interrogation (?) Donc, comme vous le dites, elle se perd probablement dans le vide.
August Karlstrom
2
Si vous avez démarré votre shell graphique à partir de gdm ou kdm, la sortie peut être trouvée dans~/.xsession-errors
Shadur

Réponses:

8

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 metacityou pidof metacitysi 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 par ps fou pstree). Supposons que l'ID de processus de votre gestionnaire de fenêtres soit 1234, exécutez

lsof -p1234

et recherchez les lignes correspondant aux descripteurs de fichiers 1 et 2, ou

ou

ls -l /proc/1234/fd

Vous pouvez automatiser le filtrage des descripteurs de fichiers appropriés:

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

(Remarque: toutes les commandes ci-dessus sont pour Linux. pgrepEst commune à d'autres unités, et lsofpeut être installée à peu près n'importe où; les psoptions et le /proccontenu 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).

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

De nombreuses distributions dirigent la sortie de la session X vers ~/.xsession-errors.

Gilles 'SO- arrête d'être méchant'
la source
Dans mon cas, la hiérarchie enfant-parent à partir du WM est blackbox <- lightdm <- lightdm <- init et tous les ttys ont la valeur "?". Je suppose alors que la sortie ne va nulle part.
Août Karlstrom
@AugustKarlstrom Ensuite pidof blackboxou pgrep blackboxpour obtenir le PID du gestionnaire de fenêtres, ou directement lsof -p$(pidof blackbox). Ttys n'a rien à voir avec ça.
Gilles 'SO- arrête d'être méchant'
1
Ah, bien sûr. La commande ls -l /proc/<blackbox-id>/fdme dit que stdout va à /dev/nullet stderr va à ~/.xsession-errors.
August Karlstrom
1

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-f1la console de sortie de l'instance X et alt-ctrl-f7l'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.

boucle d'or
la source
1
En cas de startxou xinitdirectement, on peut toujours modifier ~/.xinitrcpour faire des redirections au besoin avant de faire execsur 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 ~/.xinitrcvers ~/.xinitrc.out.
Miroslav Koškár
0

Si vous prenez ce généralement un programme démarre une autre en faisant de série man 2 forket man 2 execvepuis 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

  • appuyer sur Ctrl + P (géré par le xmonadgestionnaire de fenêtres) démarreradmenu_run
  • dmenu_runva gérer mon entrée et démarrer une application (par exemple. xkill)

La sortie ira à /dev/tty1parce que

  • xkill a été lancé par dmenu_run
  • dmenu_run a été lancé par xmonad
  • xmonad a été lancé par X
  • X a été lancé par startx
  • 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

$ lsof -p PID
Miroslav Koškár
la source