Est-il possible de lire la sortie de n'importe quel processus en utilisant son PID?

32

Est-il possible d'attacher un terminal à un processus déjà en cours d'exécution en utilisant son PID d'une manière similaire à l'utilisation de la fgcommande pour les travaux?

Tommy
la source
comme ça?! quel est le processus que vous souhaitez attacher?!
Je voudrais pouvoir voir la sortie d'un programme qui a été démarré dans un autre terminal
Tommy

Réponses:

43

Vous pouvez obtenir les descripteurs de fichiers standard de ce processus, par exemple stdout:

tail -f /proc/<pid>/fd/1
Jorge Castro
la source
8
J'ai essayé cette solution avec top et cela ne semble pas fonctionner. Dans un terminal, j'ai lancé top et dans un autre, j'ai utilisé votre commande avec le pid corrigé mais je n'ai obtenu aucune sortie.
Tommy
1
Comment faites-vous cela sur un Mac?
Avner Barr
qu'en est-il de stderr? Je suppose que / proc / <pid> / fd / 2, mais comment obtenez-vous à la fois stdout / stderr?
Alexander Mills
1
Et si ce descripteur pointe vers une socket? Tail ne peut pas le lire. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar dit Réintégrer Monica
8

Il y a quelques options ici. L'une consiste à rediriger la sortie de la commande vers un fichier, puis à utiliser tailpour afficher les nouvelles lignes qui sont 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 basée sur du texte. Les sessions d'écran peuvent être attachées et détachées, mais ne sont théoriquement destinées qu'à être utilisées par le même utilisateur, donc si vous souhaitez les partager entre utilisateurs.

Sinon, si vous le souhaitez, vous pouvez suivre le processus et voir ce qu'il fait avec strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Attachez-vous au processus avec l'ID de processus PID et commencez le traçage.
  • -s SIZE: Spécifiez la taille de chaîne maximale à imprimer (la valeur par défaut est 32).
  • -o filename: Écrivez la sortie de trace dans le nom de fichier plutôt que sur écran (stderr).
Olorin
la source
Enfin, cela ne semble pas fonctionner. J'ai lancé top et dans un autre, j'ai utilisé votre commande avec le pid corrigé mais je n'ai pas obtenu la sortie attendue. Quand j'utilise la queue par la suite.
Tommy
Vous devez utiliser sudoavec strace pour vous attacher à un processus et utiliser de -o ~/output.txtsorte que le fichier soit laissé dans votre dossier de départ.
Utilisez le fichier de sortie, n'envoyez pas à l'écran! Ne soyez pas un idiot comme je l'étais et appuyez sur Ctrl-C pour sortir de l'impasse, puis détachez mon PID. J'ai eu peur de moi sur un script important.
Weston Ganger
3

Vous pouvez utiliser les commandes ci-dessous pour attacher un processus en cours sur un autre terminal:

Exemple:

screen -S PID
retty $(pgrep PID)
reptyr PID
devav2
la source
Je n'ai pas été en mesure de trouver retty ou reptry. De plus, pour pouvoir utiliser l'écran, je dois lancer le processus d'origine avec lui afin qu'il ne résout pas mon problème.
Tommy
vous pouvez l'installer en utilisant la commande sudo apt-get install rettymais il y a peu de limitations avec retty. Consultez la page de manuel mentionnée en réponse.
devav2