2010-08-06 27 views
16

J'ai un travail cron en cours qui va durer un certain temps et je voudrais voir sa sortie standard. Je ne sais pas à quel point le fait que le processus a été lancé par cron est important, mais je pense que je le mentionnerais. C'est sur OSX donc, je n'ai pas accès à des choses comme .../proc/[pid]/..., ou truss, ou strace. Les suggestions d'exécution avec la redirection des E/S (par exemple script > output & tail -f output) ne sont PAS acceptables car ce processus est déjà en cours d'exécution et 2) ne peut pas être arrêté/redémarré avec la redirection. S'il y a des solutions générales qui fonctionneront à travers différents Unices, ce serait idéal, mais spécifiquement j'essaye d'accomplir ceci sur un Mac maintenant.Comment puis-je capturer la sortie standard à partir d'un processus qui est déjà en cours d'exécution

+0

Avez-vous essayé de joindre le processus à gdb et de rediriger la sortie standard? Voici les articles liés: http://stackoverflow.com/questions/249703/how-can-a-process-intercept-stdout-and-stderr-of-another-process-on-linux et http: // stackoverflow. com/questions/2874613/gdbosx-rediriger-stdout-peut-provoquer-printf-to-have-214-bytes-buffer. Malheureusement, après avoir joué un peu avec lui, je n'ai pas réussi à rediriger la stdout moi-même. Mais je ne parle pas très bien gdb. –

Répondre

27

solution True pour Mac OS X

Écrivez la fonction suivante à votre ~/.bashrc ou ~/.zshrc.

capture() { 
    sudo dtrace -p "$1" -qn ' 
     syscall::write*:entry 
     /pid == $target && arg0 == 1/ { 
      printf("%s", copyinstr(arg1, arg2)); 
     } 
    ' 
} 

Utilisation:

[email protected]:~$ perl -e 'STDOUT->autoflush; while (1) { print "Hello\n"; sleep 1; }' >/dev/null & 
[1] 97755 
[email protected]:~$ capture 97755 
Hello 
Hello 
Hello 
Hello 
... 

https://github.com/mivok/squirrelpouch/wiki/dtrace

REMARQUE:

Vous devez désactiver dtrace restriction sur El Capitan ou tard.

csrutil enable --without dtrace 
+0

Merci. 5+ ans plus tard, mais cela fonctionne effectivement. C'est vraiment dommage que la réponse de Mark Renouf ait été si fortement mise à jour. Même si cela peut fonctionner sur des systèmes * nix, ce n'était pas le but de la question. – theraccoonbear

+3

a ajouté ceci ''/.profile' et cela a fonctionné tout de suite! – wrossmck

+0

Est-ce que cela capture stdout et stderr ou simplement stdout? –

0

Je pense que le fait que vous avez commencé avec cron pourrait vous sauver. Sous linux, toute sortie standard d'un travail cron est envoyée au compte mail unix de l'utilisateur propriétaire du travail. Je ne suis pas sûr de l'OSX. Malheureusement, vous devrez attendre que le travail se termine avant que le courrier soit envoyé et vous pouvez voir la sortie.

+0

malheureusement c'est (était) un processus de longue durée et je voulais obtenir la sortie avant que son long temps d'exécution soit terminé. – theraccoonbear

18

AVIS DE NON-RESPONSABILITÉ: Aucune indication si Mac a ceci. Cette technique existe sur Linux. YMMV.

Vous pouvez saisir stdout/err de/proc (en supposant des privilèges appropriés):

PID=$(pidof my_process) 
tail -f /proc/$PID/fd/1 

Ou prenez tout ce qui reste dans la mémoire tampon dans un fichier:

cat /proc/$PID/fd/1 

PS: fd/1 est stdout, fd/2 est stderr.


EDIT: Alex Brown> Mac n'a pas ceci, mais c'est un conseil utile pour Linux.

+2

de ma question: C'est sur OSX donc, je n'ai pas accès à des choses comme .../proc/[pid]/ – theraccoonbear

+4

je f @ cking t'aime. – j03m

+5

'tail -f/proc/$ PID/fd/1' n'affiche rien pour moi ... sur LInux – ernesto

1

neercs a la possibilité de "saisir" les programmes qui ont été démarrés à l'extérieur. Peut-être que cela fonctionnera pour vous. BTW, vous n'avez pas de truss ou de strace, mais vous avez dtrace.

+0

J'ai installé libcaca et j'ai réussi à le trouver, mais le fichier ./configure de neercs a échoué, en commençant par : lock.c: 26: 29: erreur: pam/pam_appl.h: aucun tel fichier ou répertoire, puis signale un certain nombre d'autres erreurs liées PAM. – theraccoonbear

1

utilisez dtruss -p <PID> ou même rwsnoop -p <PID>.