2010-08-06 5 views
16

Tengo un trabajo cron en ejecución que durará un tiempo y me gustaría ver su stdout. No sé cuán importante es el hecho de que el proceso fue iniciado por cron, pero creo que lo mencionaría. Esto está en OSX entonces, no tengo acceso a cosas como .../proc/[pid]/..., o truss, o strace. Las sugerencias de ejecutar con la redirección de IO (por ejemplo, script > output & tail -f output) NO son aceptables, porque este proceso 1) ya se está ejecutando, y 2) no se puede detener/reiniciar con la redirección. Si hay soluciones generales que funcionen en varios Unices, sería ideal, pero específicamente estoy tratando de lograr esto en una Mac en este momento.¿Cómo puedo capturar el stdout de un proceso que YA está en ejecución?

+0

¿Ha intentado adjuntar el proceso a gdb y redirigir la stdout? Aquí están las publicaciones relacionadas: http://stackoverflow.com/questions/249703/how-can-a-process-intercept-stdout-and-stderr-of-another-process-on-linux y http: // stackoverflow. com/questions/2874613/gdbosx-redirecting-stdout-may-cause-printf-to-have-a-214-bytes-buffer. Lamentablemente, después de jugar con él un poco, no tuve éxito al redirigir el stdout yo mismo. Pero no soy muy fluido en gdb. –

Respuesta

27

verdadera solución para OSX

escribir la siguiente función para su ~/.bashrc o ~/.zshrc.

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

Uso:

[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

NOTA:

Debe deshabilitar dtrace restricción sobre El Capitán o posterior.

csrutil enable --without dtrace 
+0

Gracias. Más de 5 años más tarde, pero esto de hecho funciona. Es realmente una pena que la respuesta de Mark Renouf haya sido tan altamente votada. Si bien puede funcionar en sistemas * nix, ese no era el objetivo de la pregunta. – theraccoonbear

+3

agregó esto a '~/.profile' ¡y funcionó de inmediato! – wrossmck

+0

¿captura esto stdout y stderr o simplemente stdout? –

0

Creo que el hecho de que haya empezado con cron podría salvarlo. En Linux, cualquier salida estándar de un trabajo cron se envía por correo a la cuenta de correo de Unix del usuario propietario del trabajo. No estoy seguro acerca de OSX sin embargo. Lamentablemente, deberá esperar a que el trabajo finalice antes de que se envíe el correo y podrá ver el resultado.

+0

desafortunadamente, este fue (fue) un proceso de larga ejecución y quería obtener la salida antes de que se completara su largo tiempo de ejecución. – theraccoonbear

18

DESCARGO DE RESPONSABILIDAD: No hay idea si Mac tiene esto. Esta técnica existe en Linux. YMMV.

se puede agarrar stdout/err desde/proc (suponiendo privilegios adecuados):

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

o agarrar todo lo que queda en la memoria intermedia en un archivo:

cat /proc/$PID/fd/1 

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

EDIT: Alex brown> Mac no tiene esto, pero es un consejo útil para Linux.

+2

de mi pregunta: Esto es en OSX, así que no tengo acceso a cosas como .../proc/[pid]/ – theraccoonbear

+4

y te amo. – j03m

+5

'tail -f/proc/$ PID/fd/1' no imprime nada para mí ... en LInux – ernesto

1

neercs tiene la capacidad de "capturar" los programas que se iniciaron fuera de él. Tal vez te funcione. Por cierto, no tienes truss o strace, pero sí tienes dtrace.

+0

Tengo libcaca instalado y pude encontrar neercs para encontrarlo, pero neercs './configure está fallando, empezando por : lock.c: 26: 29: error: pam/pam_appl.h: No hay tal archivo o directorio, y luego informa varios otros errores relacionados con PAM. – theraccoonbear

1

use dtruss -p <PID>, o incluso rwsnoop -p <PID>.

Cuestiones relacionadas