46 votes

Comment un processus peut-il intercepter stdout et stderr d'un autre processus sous Linux?

J'ai quelques scripts qui aurait cessé de fonctionner, mais l'accrocher autour pour toujours.

Est-il un moyen pour que je puisse comprendre ce qu'ils sont en train d'écrire sur la sortie standard stdout et stderr dans un lisible ?

J'ai essayé, par exemple, de faire

tail -f /proc/(pid)/fd/1

mais cela ne fonctionne pas vraiment. C'était un long shot de toute façon.

D'autres idées ? strace sur son propre est assez verbeux et illisible pour voir ça.

Note: je suis seulement intéressé à leur sortie, pas autre chose. Je suis capable de comprendre les autres choses sur mon propre; cette question est uniquement axé sur l'obtention de l'accès à stdout et stderr des processus en cours d'exécution après le départ du.

45voto

Depuis que je ne suis pas autorisé à modifier Jauco réponse, je vais donner la réponse complète qui a fonctionné pour moi (Russell page repose sur la non garantie des comportements qui, si vous fermez fd 1 pour stdout, la prochaine creat appel sera ouvert fd 1.

Ainsi, l'exécution d'un simple sans fin de script comme ceci:

import time

while True:
    print 'test'
    time.sleep(1)

Enregistrer test.py avec le

python test.py

Obtenir le pid:

ps auxw | grep test.py

Maintenant, fixez gdb:

gdb -p (pid)

et ne le fd de la magie:

(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1

Maintenant, vous pouvez queue /tmp/stdout et de voir la sortie qui permettent d'aller à la sortie standard (stdout).

10voto

Mark Renouf Points 13128

Il y a plusieurs utilitaires qui encapsulent les "gdb méthode" et ajouter quelques touches supplémentaires. Celui que j'utilise maintenant est appelé "reptyr" ("Re-PTY-er"). En plus de l'accaparement des STDERR/STDOUT, il va effectivement changer le terminal de contrôle d'un processus (même si il n'était pas attaché à un terminal).

L'utilisation de ce est de commencer un écran de session, et de l'utiliser pour remettre en place un processus en cours d'exécution sur le terminal à l'intérieur de l'écran de sorte que vous pouvez en toute sécurité détacher d'elle et de revenir plus tard.

Il est emballé sur les distributions (Ex: "apt-get install reptyr').

http://onethingwell.org/post/2924103615/reptyr

6voto

Jauco Points 739

Je ne sais pas si cela fonctionnera pour vous, mais j'ai lu une page il y a quelque temps décrivant une méthode utilisant gdb.

6voto

Lari Hotari Points 1960

J'ai utilisé strace et décodé la sortie hexadécimale pour effacer le texte:

 PID=some_process_id
sudo strace -f -e trace=write -e verbose=none -e write=1,2 -q -p $PID -o "| grep '^ |' | cut -c11-60 | sed -e 's/ //g' | xxd -r -p"
 

J'ai combiné cette commande à partir d'autres réponses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X