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
Répondre
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
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
a ajouté ceci ''/.profile' et cela a fonctionné tout de suite! – wrossmck
Est-ce que cela capture stdout et stderr ou simplement stdout? –
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.
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
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.
de ma question: C'est sur OSX donc, je n'ai pas accès à des choses comme .../proc/[pid]/ – theraccoonbear
je f @ cking t'aime. – j03m
'tail -f/proc/$ PID/fd/1' n'affiche rien pour moi ... sur LInux – ernesto
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.
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
utilisez dtruss -p <PID>
ou même rwsnoop -p <PID>
.
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. –