web-dev-qa-db-fra.com

Attacher à une sortie de processus pour l'affichage

Comment pourrais-je «attacher» une vue console/terminal à une sortie d'applications pour que je puisse voir ce qu'elle peut dire?

Comment pourrais-je me détacher d'une sortie d'applications sans tuer l'application?

Normalement, si vous lancez une application bavarde en utilisant la ligne de commande, vous obtenez toutes sortes de sorties magnifiques. Cependant, disons que ma programmation est particulièrement bavarde, telle que KINO, et que je souhaite afficher sa sortie à tout moment sans la redémarrer via la ligne de commande. Je ne peux pas, du moins je ne sais pas comment. 

90
aggitan

Il y a quelques options ici. L'une consiste à rediriger la sortie de la commande vers un fichier, puis à utiliser "tail" pour afficher les nouvelles lignes ajoutées à ce fichier en temps réel.

Une autre option consiste à lancer votre programme à l'intérieur de 'screen', qui est une sorte d'application de terminal textuelle. Les sessions d’écran peuvent être attachées et détachées, mais sont nominalement destinées à être utilisées par le même utilisateur. Si vous souhaitez les partager entre utilisateurs, c’est très pénible.

12
Don Werve

Je pense que j'ai une solution plus simple ici, il suffit de chercher un nom dont le nom correspond au PID que vous recherchez, sous le pseudo système de fichiers accessible sous le chemin /proc. Donc, si vous avez un programme en cours d'exécution, dont l'ID est 1199, insérez-le:

$ cd /proc/1199

Ensuite, recherchez le répertoire fd ci-dessous

$ cd fd

Ce répertoire fd contient les objets descripteurs de fichiers que votre programme utilise (0: stdin, 1: stdout, 2: stderr) et juste tail -f celui dont vous avez besoin - dans ce cas, stdout):

$ tail -f 1
234
licorna

Je cherchais exactement la même chose et j'ai constaté que vous pouviez faire:

strace -ewrite -p $PID

pas exactement ce dont vous aviez besoin, mais c'est assez proche

j'ai essayé la sortie de redirection mais cela n'a pas fonctionné pour moi, maby parce que le processus écrivait sur un socket

40
Paul Scheltema

Comment pourrais-je 'attacher' un console/terminal-view à un la sortie des applications afin que je puisse voir quoi c'est peut-être dire?

À propos de cette question, je sais qu'il est possible de capturer la sortie, même si vous n'avez pas lancé de commande sceen avant de lancer le processus.

Bien que je n’aie jamais essayé, j’ai trouvé un article intéressant qui explique comment utiliser GDB (et sans redémarrer votre processus).

redirection-sortie-d'un-processus-en cours

Fondamentalement:

  1. Vérifiez la liste des fichiers ouverts pour votre processus, grâce à / proc/xxx/fd
  2. Joignez votre processus avec GDB
  3. Pendant qu'il est en pause, fermez le fichier qui vous intéresse en appelant la fonction close () (vous pouvez utiliser n'importe quelle fonction de votre processus dans GDB. Je suppose que vous avez besoin de symboles de débogage dans votre processus ..)
  4. Ouvrez le nouveau fichier en appelant la fonction create () ou open (). (Regardez dans les commentaires à la fin, vous verrez les gens suggèrent d'utiliser dup2 () pour s'assurer que le même descripteur sera utilisé)
  5. Détachez le processus et laissez-le s'exécuter.

En passant, si vous utilisez un système d’exploitation Linux sous i386, les commentaires parlent d’un meilleur outil pour rediriger la sortie vers une nouvelle console: 'retty'. Si tel est le cas, envisagez son utilisation.

6
yves Baumes

Je souhaitais suivre à distance un processus de mise à niveau yum exécuté localement. Par conséquent, bien qu'il existe probablement des moyens plus efficaces de procéder, voici ce que j'ai fait:

regarder le chat/dev/vcsa1

Évidemment, vous voudriez utiliser vcsa2, vcsa3, etc., en fonction du terminal utilisé.

tant que la fenêtre de mon terminal avait la même largeur que le terminal sur lequel la commande était exécutée, je pouvais voir un instantané de leur sortie actuelle toutes les 2 secondes. Les autres commandes recommandées ailleurs ne fonctionnaient pas particulièrement bien dans ma situation, mais celle-ci faisait l'affaire.

1
RedScourge

Pour moi, cela a fonctionné:

  1. Connectez-vous en tant que propriétaire du processus (même si root n'a pas l'autorisation)

    ~$ su - process_owner
    
  2. Terminez le descripteur de fichier comme mentionné dans de nombreuses autres réponses.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
0
akki